Java Generics ..构造函数头上的类名后面不允许输入类型参数

时间:2011-01-17 18:51:28

标签: java

只是想知道为什么在构造函数的类名后面不允许使用类型参数。我的意思是这背后的原因是什么。它是不是已经在类头上定义的类型参数,因此在构造函数上使用它是没有意义的吗?

Class A <E> {

   public E e;

   A <E> {

   }

}

好奇的

4 个答案:

答案 0 :(得分:3)

可以使用与方法相同的语法为构造函数定义类型参数。

但是,重要的是要意识到这是一个 new 类型参数,仅在构造函数执行期间可见;如果它恰好与类上的类型参数具有相同的名称,它将在更大的范围内隐藏该参数。

class Foo<T>
{
  <T> Foo(T bar) /* This "T" hides the "T" at the class level. */
  {
    ...

答案 1 :(得分:2)

如果在类级别定义泛型,则必须在声明类时声明它们。

class A<T>{}

在声明构造函数时,是否要声明T,即:

class A {
    public A<T>() {
    }
}

但是在这种情况下,当你想声明filed时,你不能在构造函数之前使用T:

class A {
    private T t; // this will throw compilation error: T is undefined. 
    public A<T>() {
    }
}

我认为这就是Sun为泛型定义现有语法的原因。

虽然您可以使用泛型类型作为构造函数的参数:

class A<T> {
    public A(T t) {
    }
}

答案 2 :(得分:1)

好吧,至少以下似乎是在Eclipse中编译的:

public class A{
      private boolean same;

  public <T> A(T t1, T t2, Comparator<? super T> comparator){
    this.same = (comparator.compare(t1, t2) == 0);
  }
  ...
}

答案 3 :(得分:-1)

顾名思义,它是一个 类型 参数,因此它的范围比构造函数或方法更宽。