您能解释一下为什么以下方法有效吗?
public class GenericsTest<T> {
public void doSomething(T v1, T v2) {
}
public static <T> void doSomethingStatic(T v1, T v2) {
}
public static <T> void doSomethingStaticList(List<T> v1, List<T> v2)
{
}
public static void main(String[] args) {
GenericsTest<String> gt = new GenericsTest<>();
// OK
gt.doSomething("abc", "abc");
// Not OK
gt.doSomething(1, "abc");
// OK
doSomethingStatic(1, 2);
// Still OK
doSomethingStatic(1, "abc");
// So why is this not OK?
List<String> list1=new LinkedList<>();
List<Integer> list2=new LinkedList<>();
doSomethingStaticList(list1,list2);
}
}
T v1, T v2
在 doSomethingStatic
中应该是相同的类型,但我仍然可以传递不同的类型(整数和字符串)。
如果 doSomethingStatic()
默认采用一个通用的父类(super class),为什么 doSomethingStaticList()
不能与不同的类型一起工作?
最佳答案
在非静态情况下,您定义 T
作为 String
当您创建 GenericsTest
的实例时.因此通过 int
将给出编译错误。如果你这样做了gt.doSomething(1, 2)
它也会失败。
在静态情况下,您不定义 T
手动,它是从参数导出的。这将是两个类的第一个公共(public)父类(super class)——在本例中是 Object
.您可能想要使用有界通配符,例如<T extends Number>
或 <T extends CharSequence>
.
请注意,您有两个不同的 T
在这里:
-
GenericsTest<T>
-
public static <T> void doSomethingStatic(T v1, T v2)
泛型参数的声明是每当你写<T>
.在这种情况下,您可以使用不同的字母以避免混淆。
关于java - 静态泛型方法,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/39849482/