我试图了解泛型。在下面的代码中,getDuplicate()返回类型PlaceHolder<X,X>
具有相同的参数X,它编译得很好。但是当我在MyClass<T,T>
中使用相同的参数类型时,它表示&#34;类型变量T已经定义了&#34;。有人可以用getDuplicate方法解释它是如何实现的吗?
class PlaceHolder<K,V> {
public K k;
public K v;
public PlaceHolder(K k, K v){
this.k = k;
this.v = v;
}
public K get(){ return k; }
public static <X> PlaceHolder<X,X> getDuplicateHolder(X x){
return new PlaceHolder<X,X>(x,x);
}
}
class MyTest<T,T> {}
答案 0 :(得分:3)
不同之处在于X
被声明一次,并且在T
被宣告两次的情况下使用两次。
在方法中,您可以在修饰符之后但在返回类型之前使用<>
声明类型参数。同样,在类和接口中,您可以在类名之后但在任何implements
和/或extends
子句之前以及类/接口主体之前声明类型参数。
您可以在他们声明的范围内使用这些类型参数。声明返回类型PlaceHolder<X, X>
正在使用X
两次,但声明类MyText<T, T>
正在尝试两次声明T
。
变量等效类比将声明变量并使用它两次:
int x;
...
x + x
VS。试图声明两个具有相同名称的变量。
int t;
int t;
您只需确认自己何时宣布类型参数以及何时使用现有类型参数。