我有这个代码:
public class Test {
public static void main(String[] args) {
Test t = new Test();
t.callTest();
}
public void callTest() {
GenericTest gt = new GenericTest<Date>(); // this line don't compile
gt.test(new Date());
}
class GenericTest<T extends Date & List> {
T x;
public void test(T y) {
System.out.println(x.toString());
}
}
}
Run Code Online (Sandbox Code Playgroud)
我理解为什么new GenericTest<Date>()不编译,这是因为Date没有实现List接口,但是如果我实例化GenericTest gt = new GenericTest()没有泛型,整个代码工作,我不明白为什么.方法测试需要(T y)where T extends Date和implements List,但它可以使用gt.test(new Date()).
Kon*_*kov 16
当你实例化这样:
GenericTest gt = new GenericTest()
Run Code Online (Sandbox Code Playgroud)
你使用原始版本的GenericTest类型.这意味着T类型将被第一个绑定替换(在您的情况下Date).这就是为什么方法契约GenericTest#test()有一个Date参数,而不是一个参数List.
请注意,除第一个绑定外,每个绑定都必须是一个接口.只有第一个边界可以是一个类.这样做的原因是它不可能有类型,它继承了超过一个超类.
因此,由于只有第一个参数是一个类,因此您将无法切换类型参数,并且以下类定义将无效:
class GenericTest<T extends List & Date> { }
Run Code Online (Sandbox Code Playgroud)