問題タブ [invariance]
For questions regarding programming in ECMAScript (JavaScript/JS) and its various dialects/implementations (excluding ActionScript). Note JavaScript is NOT the same as Java! Please include all relevant tags on your question; e.g., [node.js], [jquery], [json], [reactjs], [angular], [ember.js], [vue.js], [typescript], [svelte], etc.
julia - Julia で Vector{AbstractString} 関数パラメーターが Vector{String} 入力を受け入れない
Julia の次のコード:
次のエラーが発生します。
次のコードは実行されますが、期待どおりです。
さらに、AbstractString
一般的に次のように一致String
します。
要素Vector{AbstractString}
がある場合、パラメータを使用して関数を呼び出すにはどうすればよいですか?String
java - Stream.reduce() のような API で不変性を選択する正当な理由は何ですか?
Java 8 Stream
API の設計を見直して、Stream.reduce()
引数の一般的な不変性に驚きました。
同じ API の一見より用途の広いバージョンは、次のような への個々の参照に共分散/反分散を適用した可能性がありますU
。
これにより、現在不可能な次のことが可能になります。
回避策として、メソッド参照を使用して型をターゲット型に「強制」します。
C# には、次のように定義されているように、宣言サイトの差異を使用して、この特定の問題はありませんFunc(T1, T2, TResult)
。つまり、API を使用するFunc
と、この動作が無料で取得されます。
提案された設計に対する既存の設計の利点 (およびおそらく EG 決定の理由) は何ですか?
または、別の言い方をすれば、私が見落としている可能性のある提案された設計の注意点は何ですか (例: 型推論の難しさ、並列化の制約、または結合性などのリダクション操作に固有の制約、将来の Java の宣言サイトでの差異の予測BiFunction<in T, in U, out R>
、 ...)?
java - ジェネリッククラスをキャストできるのはなぜですか?
Javaジェネリックは不変であるため、そのようなキャストを行うことは不可能です:
しかし、次の 4 行目のコードでは、 from からList<Integer>
toList<T>
にキャストできます。ここでT
は、任意の型を指定できます。なぜそのタイプのキャストが許可されているのですか?
チェックされていないキャストに関する警告が生成されることは知っていますが、ポイントは、このキャストはパラメーター化されたメソッド内で可能ですが、通常のコードでは不可能であるということです。ジェネリックは不変であることに注意してください。なぜそれが許可されているのですか? 通常のコードでは、意味をなさないものList<Integer>
にしかキャストできず、他のキャストは違法です。List<Integer>
それでは、4行目のようなキャストを許可するポイントは何ですか?
ジェネリック型はコンパイル時に削除され、 で終わることは知っていますが、これらの型を削除する前に、誰かが Integer を渡す場合にのみ受け入れられない限り、このキャストを許可しないList xlist = (List)list
ことは明らかです。el
.
rust - Rustでラッパー型の不変性をどのように扱うのですか?
&Rc<T>
やのようなラッパー型への参照は、 (が a の場合でもaではありません) では&Box<T>
不変です。問題の具体例 ( Rust Playground ):T
&Rc<T>
&Rc<U>
T
U
このコードにより、次のエラーが発生します。
Box<T>
(Rust Playground )を使用した同様の例(同様のエラーあり):
これらの場合、もちろんa
、目的のタイプで注釈を付けることができますが、多くの場合、元のタイプも必要になるため、それは不可能です。それで、私は何をしますか?
scala - 上限のサブクラスでパラメータ化された不変のジェネリック型が適合しないのはなぜですか?
与えられた:
以下は誤りです
なんで?
Scala では、ジェネリック型にはデフォルトで非バリアント サブタイプがあることを理解しています。したがって、この例のコンテキストではInvar
、異なる型パラメーターを持つ のインスタンスが互いにサブタイプの関係になることはありません。したがって、Invar[ExtendsAnyref]
は として使用できませんInvar[AnyRef]
。
しかし、「型階層の _ <: AnyRef
下にある型」を意味すると理解した意味について混乱しています。は型階層の下にある型なので、に準拠することが期待されます。AnyRef
ExtendsAnyref
AnyRef
Invar[ExtendsAnyref]
Invar[_ <: AnyRef]
関数オブジェクトは入力パラメーターの型が反変であることは理解していますが、明らかに間違って理解したのでInvar[_ <: AnyRef]
はなくInvar[AnyRef]
使用しているため、上限の使用には「Invar
パラメーター化Anyref
またはその拡張」という意味があります。
私は何が欠けていますか?
java - Javaにおける「?eのキャプチャ」の意味
IntelliJ IDEA では、特に次のCollection
ようなクラスのインスタンスを作成する場合:
メソッドを入力してみるとadd
、IntelliJ はadd
最初の引数がであることを教えてくれますcapture of ? e
。
とにかく、次のような引数として値を使用することはできません。
メッセージは
add(
capture<?>
) inは ( )にCollection
適用できませんjava.lang.Integer
どういう意味ですか?
scala - Scala Set、不変型で何が起こっているのですか?
scala アプリケーションでリファクタリングを行っているときに、List から Set に変更すると、以前にはなかった問題が発生する状況に遭遇しました。分散についてはある程度の考えがありますが、コンパイラにとって正確に何を意味するのかを理解したいと思います。
私はこれに似たものを持っていました.これはコンパイルしてうまく動作します:
次に、リストを次のように変更しました。
この時点で、MyClassSet 型のオブジェクトを作成することは、Set を引数として渡すことで、それが Any の Set を受け入れる場合でも、もはや問題ありません。ここで、以下が機能すると少し混乱しました (セットは以前の mySet と「同じ」であることに注意してください)。
簡単な説明は、コンパイラが mySet val を Set[(String, Boolean)] として推論しているということだと思いますが、setWorks1 の引数リストで直接インスタンス化すると、Set[Any] を受け入れるため、コンパイラはSet[Any] として推論します。これにより、最初の例は失敗し、2 番目の例は成功します。これらのものも機能します。これは、前のものが正しいことを示しています。
コンパイラによって表示される実際のエラーは次のとおりです。
リストとセットは次のように定義されます。
- この違いは、「Any よりも制限された型」の List を引数として渡すことを可能にするが、Set の場合は a ではないという型の分散の違いですか?
- この違いは、型間のキャストまたは変換を妨げているだけですか?
- これは主にコンパイラの「制限」ですか、それとも不変型の予想されるプロパティですか?
- 「実際には」不変型の間に他の違いはありますか、それともこのようなキャストに要約されますか?
scala - IntelliJ IDEA: Scala のデフォルト パラメーター値
Scala REPL ではSeq[String]()
、 type のパラメーターのデフォルト値として使用できますSeq[T]
。
IDEA で同じことを試してみると、「Seq[String] が期待される型 Seq[T] に準拠していません」というエラーが表示されます。なんで?
- IntelliJ IDEA 2016.2.4
- Scala プラグイン 2016.2.1
- スカラ 2.11.7
注 1: 申し訳ありませんが、私の例の関数があまり意味をなさないことはわかっています。ただし、私の実際の (そして便利な) 関数は、ここに投稿するには不必要に複雑です。
注 2: 最初は、この例の型名は型TではなくAnyでしたが、これは良い考えではなく (scala.Any を隠しているため)、混乱を招きました。したがって、私はそれを修正しました。
ocaml - OCaml 分散 (+'a, -'a) と不変性
このコードを書いた後
info
ミュータブルである必要があることに気づきました。
私は書いた:
しかし、驚いたことに、
ああ、分散について聞いた覚えがあります。それは共分散と反分散に関するものでした。私は勇敢な人です、私は自分の問題を一人で見つけます!
この 2 つの興味深い記事 (こことここ) を見つけて、理解しました!
私は書くことができます
しかし、私は疑問に思いました。変更可能なデータ型が共変ではなく不変なのはなぜですか?
つまり、私のリストは変更できないため、'A list
an は an のサブタイプと見なすことができることを理解しています。('A | 'B) list
関数についても同じことが言えます。タイプの関数がある場合、'A | 'B -> 'C
タイプの関数のサブタイプと見なすことができます。これは、関数がとを処理できる場合は のみを処理でき、 のみを返す場合は を処理できるためです。確かにまたはが期待されます(ただし、私はのみを取得します)。'A -> 'C | 'D
'A
'B
'A
'C
'C
'D
'C
しかし、配列の場合は?を持っている場合、それを anと'A array
見なすことはできません。('A | 'B) array
なぜなら、配列内の要素を変更して a を入れると'B
、配列型が間違っているからです。しかし、としてのa はどうでしょうか。はい、配列に含めることができるので奇妙ですが、奇妙なことに、関数と同じだと思いました。結局、すべてを理解できなかったかもしれませんが、理解するのに時間がかかったので、ここで考えを述べたいと思いました。('A | 'B) array
'A array
('A | 'B) array
'A array
'B
TL;DR :
持続的に :
+'a
機能 :
-'a
可変: 不変 (
'a
) ? 強制できないのはなぜ-'a
ですか?
scala - SLS3.2.10、ここでの不変性の何が問題になっていますか?
ここで問題に遭遇する Scala 初心者:
ビルド時のエラーが発生しました: Error:(12, 11) type mismatch; found : com.google.common.cache.LoadingCache[Long,String] 必須: com.google.common.cache.LoadingCache[Long,String] 注: Long <: Long ですが、Java 定義の特性 LoadingCache は型 K で不変です. などのワイルドカード タイプを調査することをお勧めし_ <: Long
ます。(SLS 3.2.10) .build(
ここで正しい修正は何ですか?コードが間違っているのはなぜですか?ありがとう。