問題タブ [subtyping]

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.

0 投票する
1 に答える
191 参照

java - 生の型とサブタイピング

次のコードを検討してください。

「生の型とは何か、それを使用すべきではない理由は?」のトピックを読みました。したがって、パラメータ化された型がある場合、生の型の定義により、コンパイル時に生の型へのMyClass<T>参照を定義できます。MyClass mさらにMyClass、指定されたパラメータ化された型に対応する生の型は、すべての特定の型の型消去前のコンパイル時MyClass<T>のスーパークラスです。この理由は正しいですか?MyClass<E> E

0 投票する
1 に答える
3101 参照

scala - Scala の UpperBound と LowerBound の概念

以下は、実行しようとしているコードです。

printStudentDetailsからのメソッドMyGenericClassforLowerBoundが問題を作成しています。ステートメントstudent.printDetailsstudent.printSomeOtherDetailsは私に言っています

私が理解している限り:

  • Q[A <: B]クラス/メソッドは、 Classが class のサブタイプである class のQ任意のオブジェクトを取ることができることを意味します。これを上限と呼びます。AAB
  • Q[A >: B]クラス/メソッドは、 Classが class のスーパータイプである class のQ任意のオブジェクトを取ることができることを意味します。これを下限と呼びます。AAB

私の理解が間違っている場合は助けてください。また、上記の問題が発生する理由を理解するのを手伝ってください。みんなありがとう。

0 投票する
1 に答える
392 参照

java - Java: サブタイプでジェネリック型制限を指定する

Java のジェネリック型について質問があります。具体的には、現在、次のようなコードがあります。

問題は、FooImpl クラスに bar メソッドを実装していないことをコンパイラが訴えることです。

私が望むのは、ジェネリック型にいくつかの追加の制限を加えることです。具体的には、それらが比較できるようにすることです。しかし、すべての実装がその制限を必要としないため、Foo インターフェースにその制限を入れたくありません。これは可能ですか?修正するにはどうすればよいですか?

よろしくお願いします!

編集 1: クラス --> クラスおよびインターフェイス --> インターフェイスのタイプミスを修正しました。しかし、戻り値の型はまだ void であり、T ではありません。これは無関係だと思います。私の実際の戻り値の型はブール値です。

編集 2: 要求された実際のコード:

0 投票する
2 に答える
1291 参照

java - 反変メソッドの引数の型

wiki Contravariant_method_argument_typeによると、メソッドのオーバーライドには関数型としてのサブタイプ規則がありますが、反変の引数型をサポートする言語は 1 つだけです。また、それを使用するメリットについても思いつきませんでした。

例:

私の質問は:

  1. オーバーライドメソッドの反変引数型は役に立ちますか? はいの場合、それはどこですか?
  2. メソッドは関数ですか?なぜScalaは関数型とオーバーライドメソッド型で異なるルールを持っているのですか?
0 投票する
1 に答える
61 参照

java - インターフェースおよび実装クラスの論理的根拠におけるジェネリックスのパラメーター化された定義

ジェネリックに関連するサブタイピング/インターフェース実装の背後にある概念を理解できません。説明してください。私は以下の構造を持っていました:

私の理解では、IProducerConsumer を実装する具象クラスは、Number および ICommand インターフェイスのサブクラスである T 型のオブジェクトを保持する必要があります。

IProducerConsumer<T extends Number,ICommand>

次に、実装クラス SimpleProducerConsumer を書きたいと思います。

ここでの意図は、SimpleProducerConsumer が、以下のように IProducerConsumer 型パラメーターで定義されている任意の型パラメーターを保持できることを伝えたいということです。

それは機能しません、それは以下のように言います:

*境界の不一致: 型 T は、型の境界付きパラメーターの有効な代替ではありませんIProducerConsumer<T,ICommand>*

それで、私の最初の質問は、具象クラスのインターフェイスと同じように定義できないのはなぜですか。ボンネットの下で何が起こっているのか。

定義できれば

なぜ私は実装中に同じことができないのか、混乱しています。

今、私は以下のように定義します

それでも IProducerConsumer の T は文句を言います。

以下のように変更した場合:

extends は、トークンを削除するように言って文句を言います。

今、私は以下のようにこれを好きです:

IProducerConsumer で拡張しても機能しません。

はい、コンパイラは満足しています。今、私は完全に迷っています。上記のことはどういう意味ですか。SimpleProducerConsumer には Number のサブクラスであるタイプ T のオブジェクトが含まれており、ProducerCommand オブジェクトは理にかなっていますが、IProducerConsumer はタイプ T のオブジェクトを保持していますか??? これは何ですか ?

この背後にある理論的根拠は何ですか。誰か説明してください。