Java泛型:多个边界

Bla*_*aze 13 java generics

我有这个代码:

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)