-1
  1. ジェネリック クラスまたはメソッドの型パラメーターの強力な定義がわかりません。そのような参照型です...何ですか?それは非具象化可能なタイプですか?コンパイラのすべての参照型が具体化できるか、具体化できないというのは本当ですか?

2.よく知られているコードを考えてみましょう:

List<? extends String> strs= new ArrayList<String>();
? extends String str;//error
strs.add("sd");//error

なぜ? extends String str;有効ではないのですか?たとえばList<E> strs;、ある型のジェネリック型への参照を宣言するとE、コンパイラは型パラメーターを特定の型に定義すると思いましたE

ケースで何が起こるかわかりList<? extends String> strsませんか?List<? extends String>and は、たとえばList<String>、コンパイル時に同様に解析するか、具体化可能な型List<? extends String>とは異なる解析を行いますか?List<E>E

4

2 に答える 2

1

ジェネリックは、型を指定するために使用されます。

次のクラス定義を検討してください。

public interface List<E> extends Collection<E>  

これは、任意の型の要素を保持できる List があることを示しています。
に制限がないことに注意してくださいE

次のようにクラスを定義すると:

public class MyList<T extends String> implements List<T>

Stringこれで、List を実装する MyList ができましたが、 s (または被相続人) のみを受け入れます。

このクラス内では、 を参照できますT

public class MyList<T extends String> implements List<T> {
  private ArrayList<T> internalStorage;

重要なポイント
クラス定義では、定義されているものを定義しましたT。String に基づく任意のクラスです。
したがって、クラス内で T を参照できます。
ただし、クラスが実際にインスタンス化されるまで、T のフレーバーは修正されません。

MyList<MyStringType> test = new MyList<MyStringType>(parameters);  //java 6
MyList<MyStringType> test = new MyList<>(parameters);  //java 7, same but shorter.

これで Javaは、クラス TT内の意味MyListが MyStringType であることを認識します。
知識を武器に、Java はクラスをコンパイルし、すべての参照をT実際のクラスへの参照に置き換えますMyStringType
Tのことは完全に忘れている。

クラス内では、T言及されているすべての箇所が MyStringType に置き換えられることに注意してください。
しかし、必ずしも MyStringType ではなく、文字列を処理したい場合はどうでしょう。

解決策:
次のようにメンバーを定義します。

List<? extends String> strs;  //Will fill the data in later

これで、文字列のみを受け入れる strs という名前のリストができましたが、MyStringType 型の文字列の使用は強制されません。このリストは、がインスタンス化されたときに修正され
た の定義にバインドされていません。 に値を割り当てると、リストのフレーバーが修正されます。あなたの例では、文字列のリストになります。 TMyList
strs

? extends String str;//error 

変数を保持するクラスが作成されるときにその型を特定できないため、変数を修正できません。

于 2013-10-09T18:22:40.140 に答える
0

Generics は、書き込み用ではなく読み取り用に設計されています。これが、メソッドのパラメーターでジェネリックを使用できる理由ですが、後で読み取り/書き込みに使用できる変数を宣言するために使用することはできません:-)

于 2013-10-09T17:09:05.700 に答える