为什么我们可以实例化Pair <t>但我们不能使用Pair <! - ? - > </t>

时间:2012-12-20 21:46:23

标签: java generics wildcard type-parameter bounded-wildcard

那么为什么我们能够实例化Pair但我们无法实例化Pair

Pair<T> p=new Pair<T>();

VS

Pair<?> p=new Pair<?>();

我知道<?>意味着未知类型 - &gt; <? extends Object>

但不是<T>意味着同样的事情---&gt; <T extends Object>

有人有想法吗?

3 个答案:

答案 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<?>几乎没有什么可以做的(例如你不能把任何数据放进去),因为你不知道类型参数。