我有一个以下类型的变量
Pair<String, Class<?>> test;
Run Code Online (Sandbox Code Playgroud)
我试图像这样创建它:
Class<? extends Animal> animal = Tiger.class;
test = Pair.create("tiger", animal);
Run Code Online (Sandbox Code Playgroud)
代码给了我"不兼容的类型"(同时创建与动物配对).虽然变量测试定义允许任何类型的动物和动物定义任何动物儿童类别的边界,这比原始类别更严格.那么这项任务不应该起作用吗?
Tiger是 的子类型Animal,但Class<Tiger>不是的子类型Class<Animal>。Class<Tiger>和的父级Class<Animal>是Class<?>。
同样,Pair<String, Class<? extends Animal>>不是 的子类型Pair<String, Class<?>>,它们实际上是不同的对象,即使Class<? extends Animal>>是 的子类型Class<?>。
为了更容易理解,可以从集合的角度来思考:如果你有一个Pair<String, List<?>>,并且你将 a 分配Pair<String, List<? extends Number>>给它;然后您就可以将 a 添加String到列表中。http://ideone.com/dcXnWs
在 Java8 中,您的代码可以工作http://ideone.com/AkK7Zv;老实说,我不确定编译器还做了什么(仍然需要深入研究新功能)。无论如何,正如您所看到的,以下示例的编译器错误非常具有解释性:
Java8: http: //ideone.com/ZRGbyr
error: incompatible types: List<Class<? extends Animal>> cannot be converted to List<Class<?>>
Java7: http: //ideone.com/dcXnWs(相同代码)
error: incompatible types
| 归档时间: |
|
| 查看次数: |
661 次 |
| 最近记录: |