以下代码无法编译:
public class GenericsTest {
public static void main(String[] args) {
MyList<?> list = new MyList<Object>();
Class<?> clazz = list.get(0);
// Does not compile with reason
// "Type mismatch: cannot convert from Object to Class"
MyList list2 = new MyList();
Class clazz2 = list2.get(0);
}
static class MyList<T> extends ArrayList<Class<T>> {
}
}
Run Code Online (Sandbox Code Playgroud)
我想这样做是为了在不破坏构建的情况下将泛型引入旧代码.
这是编译器(eclipse和javac)中的错误还是我在这里遗漏了什么?将泛型引入MyList还有什么其他可能性?
编辑
为了澄清:
我有通用类
public class MyList extends ArrayList<MyObject> {}
Run Code Online (Sandbox Code Playgroud)
同
public class MyObject {}
Run Code Online (Sandbox Code Playgroud)
和使用MyList的代码
MyList list = new MyList();
...
MyObject o = list.get(0);
Run Code Online (Sandbox Code Playgroud)
现在在开发过程中,我看到我想向MyObject引入泛型
public class MyObject<T> {}
Run Code Online (Sandbox Code Playgroud)
现在我想在MyList中拥有这个新的通用东西
public class MyList<T> extends ArrayList<MyObject<T>> {}
Run Code Online (Sandbox Code Playgroud)
但这确实打破了我的构建.有趣的是
public class MyList<T> extends ArrayList<MyObject<T>> {
public MyObject<T> get(int i) {
return super.get(i);
}
}
Run Code Online (Sandbox Code Playgroud)
将允许旧代码
MyList list = new MyList();
...
MyObject o = list.get(0);
Run Code Online (Sandbox Code Playgroud)
编译.
好吧,似乎当我介绍这个泛型时,我将不得不将所有对MyList的调用更改为通用形式.我希望旧代码只引入警告而不是错误.
mat*_*t b 12
我认为你并不了解泛型如何运作.
MyList<?> list = new MyList<Object>();
Class<String> clazz= list.get(0);
Run Code Online (Sandbox Code Playgroud)
这段代码片段无法编译,因为您告诉编译器list将保留Class<Object>类型 - 然后在下一行中,您希望它返回给您Class<String>.Java中的通用系统不能像你想象的那样转换基于继承的泛型使用的类型.
如果你期望list持有Class<String>,那么你需要声明它 - 或者,如果你希望它能够持有任何类型,那么你不能在没有强制转换的情况下进行第二行.
MyList<String> list = new MyList<String>();
Class<String> clazz = list.get(0);
Run Code Online (Sandbox Code Playgroud)
要么
MyList<?> list = new MyList<Object>();
//generates a warning about an unchecked cast
Class<String> clazz = (Class<String>) list.get(0);
Run Code Online (Sandbox Code Playgroud)
第二个代码片段不起作用,因为当您使用原始类型时,仍然需要将Object返回get()的内容强制转换为您正在使用的声明类型(这一直是这种情况).
MyList list2 = new MyList();
Class clazz2 = (Class) list2.get(0);
Run Code Online (Sandbox Code Playgroud)
| 归档时间: |
|
| 查看次数: |
544 次 |
| 最近记录: |