只是想知道为什么在构造函数的类名后面不允许使用类型参数。我的意思是这背后的原因是什么。它是不是已经在类头上定义的类型参数,因此在构造函数上使用它是没有意义的吗?
Class A <E> {
public E e;
A <E> {
}
}
好奇的
答案 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)
顾名思义,它是一个 类型 参数,因此它的范围比构造函数或方法更宽。