では、Pair をインスタンス化できるのに、Pair をインスタンス化できないのはなぜですか。
Pair<T> p=new Pair<T>();
VS
Pair<?> p=new Pair<?>();
私はそれが<?>
不明なタイプを意味することを知っています-><? extends Object>
しかし、<T>
意味は同じではありません ---><T extends Object>
誰にもアイデアがありますか?
では、Pair をインスタンス化できるのに、Pair をインスタンス化できないのはなぜですか。
Pair<T> p=new Pair<T>();
VS
Pair<?> p=new Pair<?>();
私はそれが<?>
不明なタイプを意味することを知っています-><? extends Object>
しかし、<T>
意味は同じではありません ---><T extends Object>
誰にもアイデアがありますか?
<T>
それ自体には何の意味もありません。T
タイプは、クラスまたはメソッド レベルのどこかで定義する必要があります。
public class PairFactory<T> {
public Pair<T> makePair() {
return new Pair<T>();
}
}
この場合、<T>
インスタンス化中に次のことを決定します。
new PairFactory<String>();
これはもう少し複雑です:
public <T> Pair<T> makePair() {
return new Pair<T>();
}
コンパイラは、コンテキストに基づいて型を見つけようとします。たとえば、次のようになります。
Pair<Date> p = makePair();
通常は役に立たないため、パラメーターとしてワイルドカードを使用してインスタンス化することはできません。代わりに、型パラメーターの境界内にある任意の参照型を使用できます (この場合、境界がないため、任意の参照型のみです)。
class SuperCrazyBogusType { }
Pair<?> p = new Pair<SuperCrazyBogusType>();
(または、のようなより通常のタイプを使用できますObject
)。
それがどれほど奇妙か分かりますか?はい、プログラムの残りの部分や実行していることに関係のないものであっても、そこにある任意の型を使用してインスタンス化できます。はい、それは 100% 安全で正しいですPair<?>
。
それがばかげている理由と、これを行うための構文が不要な理由を指摘しています。型パラメーターがわからないため、取得した でできることはほとんどありませPair<?>
ん (たとえば、データを入れることができません)。