Java 当一个方法只有一个泛型类型时,让它泛型有什么意义?

Java 当一个方法只有一个泛型类型时,让它泛型有什么意义?,java,generics,generic-method,Java,Generics,Generic Method,如果方法定义为: <T> List<T> transform(List<T> list) 第一个T添加了什么?因为它本质上与: List<T> transform(List<T> list) List<T> transform(List<T> list) 这就是定义。您需要在使用泛型类型参数之前定义它们,就像您必须在使用它们之前定义变量一样 记住,T只是一种命名约定。该标识符可以是任何东西。可能是,也可能是

如果方法定义为:

<T> List<T> transform(List<T> list)
第一个T添加了什么?因为它本质上与:

List<T> transform(List<T> list)
List<T> transform(List<T> list)
这就是定义。您需要在使用泛型类型参数之前定义它们,就像您必须在使用它们之前定义变量一样

记住,T只是一种命名约定。该标识符可以是任何东西。可能是,也可能是

假设他们按照您的建议实现了它,而编译器只是推断出任何缺少的类型都是泛型类型参数。假设我有一个我忘记导入的自定义类Foo

List<Foo> transform(List<Foo> list)
编译器会说Ok,我不知道Foo是什么,所以让我们假设它是一个泛型参数。然后,当您希望编译器能够发现错误时,您的方法就可以正常编译了

或者你认为T应该是个特例。然后,你将学习一些目前只是一种惯例的东西,并使之成为语言的一个特殊部分。您必须处理有人创建一个名为T的真实类的可能性

因此,显式声明有其用途,即使它们有时看起来很冗长

然后只能传入/返回与类相同元素类型的列表:

GenericClass<String> genericClass = new GenericClass<>();
List<String> stringList = genericClass.transform(Arrays.asList(""));  // OK.
List<Integer> intList = genericClass.transform(Arrays.asList(0));  // Error!

区别在于T的范围。它可以在类级别上定义,也可以为每个单独的方法定义

List<T> transform(List<T> list)

此方法有自己的T,与它的类的泛型类型(如果有的话)无关。

它完全不同

声明变量,其余部分是变量的使用。此直接向上编译失败:

public class Example {
    public List<T> transform(List<T> foo) {}
}
foo的int x与int x完全无关;字段,但由于它们具有相同的名称,因此无法引用名为x的字段。至少对于这一点,这里有一个转义,this.x仍然引用这个字段-对于泛型没有这样的奢侈,所以,不要像这样阴影化变量

如果您有此代码,那么您根本不可能在方法上使用类型var;但如果你真的这么做了,不要用t,而是用其他任何东西:

public class Foo<T> {
    public <Y> List<Y> transform(List<Y> foo) {}
}

如前所述,以下内容基本相同

<T> List<T> transform(List<T> list)

List<T> transform(List<T> list)
但前者也允许进一步约束T。例如,您可以

<T extends Foo> List<T> transform(List<T> list) {
...   
}

只有当T子类Foo时,才能传递列表。

第二种情况可能引用类或接口T,而不是类型参数T。
public class Example {
    public List<T> transform(List<T> foo) {}
}
public class Example<T> {
    public <T> List<T> transform(List<T> foo) {}
}
public class Example {
    int x;

    public void foo(int x) { }
}
public class Foo<T> {
    public <Y> List<Y> transform(List<Y> foo) {}
}
<T> List<T> transform(List<T> list)

List<T> transform(List<T> list)
<T extends Foo> List<T> transform(List<T> list) {
...   
}