0

我正在尝试理解泛型。在下面的代码中,getDuplicate() 返回类型PlaceHolder<X,X>具有相同的参数 X,可以很好地编译。但是当我在其中使用相同的参数类型时,MyClass<T,T>它会显示“类型变量 T 已定义”。有人可以解释如何使用 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> {}
4

1 回答 1

3

不同之处在于X声明一次并使用两次,其中T声明两次。

在方法中,您可以使用<>after 修饰符但在返回类型之前声明类型参数。同样,在类和接口中,您可以在类名之后、任何implements和/或extends子句之前以及类/接口主体之前声明类型参数。

您可以在声明它们的范围内使用这些类型参数。声明返回类型PlaceHolder<X, X>是使用X两次,但声明一个类MyText<T, T>是尝试声明T两次。

变量等效的类比是声明一个变量并使用它两次:

int x;
...
x + x

与尝试声明两个具有相同名称的变量相比。

int t;
int t;

您只需要确保知道何时声明类型参数以及何时使用现有类型参数。

于 2016-04-28T21:14:59.403 回答