构造方法中的泛型约束失效问题

    @Test
    public void testRaw() {
        Fruit<String> fruit = new Fruit<>();
        Basket<Integer> basket = new Basket(fruit); // 不报错!
        basket.setFruit(fruit); // 报错: required type Fruit<Integer>   
    }

    private static class Basket<V> {
        public Basket(Fruit<V> f) {
        }

        public void setFruit(Fruit<V> f) {
        }
    }

    private static class Fruit<R> {
    }

Basket的构造方法传入的不匹配类型不报错,下面的setFruit方法会报错,这是什么原因?

要看Basket的构造函数,内部代码是怎么处理的。

你这前面构造要求传 Fruit<Integer>setFruit 就同样需要 Fruit<Integer>, 但是你传了个 Fruit<String>,这类型都不匹配

问题出在调用构造方法上,使用new调用构造方法的时候,没有在类名后加上对应的泛型约束,使用的raw type而不自知了。其实让题主困惑的那一句,可以改写成这样:

Fruit<String> fruit = new Fruit<>();
Basket<Integer> basket = new Basket(fruit); // 不报错!这一句等价于如下两句:

Basket basket1 = new Basket(Fruit);
Basket<Integer> basket2 = basket1;

将代码中的raw type换成具体的约束类型,立马就会报错了。如下:

Fruit<String> fruit = new Fruit<>();
Basket<Integer> basket = new Basket(fruit); // 不报错!
Basket<Integer> basket2 = new Basket<Integer>(fruit); // 报错
Basket<Integer> basket2 = new Basket<>(fruit); // 报错 java1.7写法

这个问题主要还是Java1.5引入泛型时为了保证对1.5之前的支持搞的raw type(即原始类型,常见如:List list = xxx)导致。

怪我提问时没有说清,让有的朋友认为我想问的时为什么第三行报错,而不是第二行不报错了。好在经过一上午的研究,自己知道咋回事了,感觉又有提升。

采纳第一个朋友吧,来的早。