那么为什么我们能够实例化Pair但我们无法实例化Pair
Pair<T> p=new Pair<T>();
VS
Pair<?> p=new Pair<?>();
我知道<?>
意味着未知类型 - &gt; <? extends Object>
但不是<T>
意味着同样的事情---&gt; <T extends Object>
有人有想法吗?
答案 0 :(得分:3)
<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();
答案 1 :(得分:2)
不,?和T不是一回事。 ?表示通配符泛型类型参数 - 它可以是运行时的任何内容。 T
表示在运行时特定类型的泛型类型参数 - 我们在编译时不知道它。
也就是说,List<?>
可以包含字符串,整数,浮点数等。List<T>
只能包含参数化为T
的任何内容。
答案 2 :(得分:0)
不允许使用通配符作为参数进行实例化,因为它通常是无用的。相反,您可以使用任何类型参数范围内的引用类型(在这种情况下,没有边界,所以只有任何引用类型):
class SuperCrazyBogusType { }
Pair<?> p = new Pair<SuperCrazyBogusType>();
(或者您可以使用更为正常的类型,例如Object
)。
你觉得这有多奇怪吗?是的,你可以使用任何类型的实例化,甚至是那些与你的程序的其余部分或你正在做的事情无关的类型。是的,它是100%安全和正确的,因为您想要的只是Pair<?>
(一对未知类型)。
这指出了为什么它是荒谬的,为什么这样做的语法是不必要的。你得到的Pair<?>
几乎没有什么可以做的(例如你不能把任何数据放进去),因为你不知道类型参数。