什么<T>表示<T> void说()

Dha*_*hri 8 java generics

<T>以下代码段中的含义是什么?

class Test {    
     <T> void say() {

     }    
}
Run Code Online (Sandbox Code Playgroud)

Evg*_*eev 11

在你的例子中它真的没有意义.但在其他情况下,如果方法的返回类型为void,则<T>仍可以将其用作预期的通用参数类型.考虑一下

public static <T> void test(List<T> list1, List<T> list2) {
    list1.addAll(list2);
}

public static void main(String[] args) throws Exception {
    test(Arrays.asList(1, 1), Arrays.asList("1", "1"));
}
Run Code Online (Sandbox Code Playgroud)

类型安全控制,javac给出错误,test()期望列出相同类型.

另一个例子是java.util.Collections.fill

public static <T> void fill(List<? super T> list, T obj) {
    ....
}    
Run Code Online (Sandbox Code Playgroud)

再次进行安全控制.


Mat*_*eid 8

它引入了一个类型占位符,T可能几乎任何类型.如果它T是签名的一部分(作为参数或返回类型),这通常很有用:

<T> void say(T myT) {}
say<Object>(myObject);
say<String>(myString);

<U> U foo(U u) { return u; }
String s = foo<String>("");
Run Code Online (Sandbox Code Playgroud)

引入仅供内部使用的类型参数很少有用,因为T对于消费者来说,实际情况通常比方法更有趣.