泛型 - 不兼容的类型

时间:2016-07-13 15:48:26

标签: java generics incompatibility

public class HelloWorld{

public static void main(String[] args) {

    List<? extends Number> callback = new ArrayList<Long>();
    new Container<>().test(callback);
}

public static class Container<T extends Number> {

    public void test(List<T> some) {

    }

}

}

此代码生成

HelloWorld.java:7: error: incompatible types: List<CAP#1> cannot be converted to List<Number>                                                                                                                                                          
        new Container<>().test(callback);                                                                                                                                                                                                              
                               ^                                                                                                                                                                                                                       
  where CAP#1 is a fresh type-variable:                                                                                                                                                                                                                
    CAP#1 extends Number from capture of ? extends Number  

您能否详细解释此代码不正确。

我希望新的Container可以使用与回调

兼容的类型进行推广

2 个答案:

答案 0 :(得分:1)

首先,由于String是最终类,因此不能存在扩展String的类型。

其次,编译器无法确定您用于? extends SomeType的类型List是否与用于T extends SomeType类的Container类型相同,因此它会产生错误。

您需要做的是在方法签名中声明泛型类型,并对ListContainer使用该类型:

public <T extends SomeClass> void example() {
    List<T> callback = new ArrayList<>();
    new Container<T>().test(callback);
}

或者使用无限制类型声明列表:

List<SomeClass> callback = new ArrayList<>();
new Container<>().test(callback);

答案 1 :(得分:1)

嗯,你正在使用泛型。当你定义Container时,它告诉Container默认构造函数必须支持一个String实例的类型。 这是一个正确的例子,String是Object的subClass,所以我使用它。

public class HelloWorld{

    public static void main(String[] args) {

        List<String> callback = new ArrayList<String>();
        new Container<String>().test(callback);
    }

    public static class Container<T extends Object> {

        public void test(List<T> some) {

        }

    }
}

我希望这会对你有所帮助。