2013-07-15 90 views
3

这里的示例代码:Java泛型类型转换

public static BaseListAdapter<? extends Item> getListAdapter() { 
    ... 
} 

... 

public class MyClass<T extends Item> { 
    ... 
    BaseListAdapter<T> adapter = (BaseListAdapter<T>) getListAdapter(); 
    ... 
} 

编译器抱怨有一个未经检查的演员。

java: unchecked cast 
    need: BaseListAdapter<T> 
    found: BaseListAdapter<capture#1, ? extends Item> 

我想知道为什么会产生此警告以及如何解决它。

+2

警告没有错误。你告诉编译器'BaseListAdapter <?通过明确的转换扩展Item>'的类型'BaseListAdapter ''。编译器只是说他无法验证这一点,所以你是独立的。 –

+0

请参阅此链接, 这可能有帮助 http://stackoverflow.com/questions/262367/type-safety-unchecked-cast –

回答

0

这是因为,虽然BaseListAdapter接受来自项目延长任何类型的,你明确地铸造任何醇”类型BaseListAdapter到BaseListAdapter与T类型,这是不一定相同键入,因此错误。

如果你想修复它,那么你需要避免完全投射并用Item来管理,或者使BaseListAdapter处理T而不是一些未命名的类型?扩展Item。

+0

谢谢!你的答案既简单又明确。 – Lion

6

你可能想

public static <T extends Item> BaseListAdapter<T> getListAdapter() { 
+0

这是否真的能解决问题?这里的“T”保证与课堂上使用的“T”相同吗?我不这么认为,如果该方法与“MyClass”不同的类。 –

+0

仍然警告似乎并没有消失 – sanbhat

+0

@RohitJain:'T'肯定是不同的。但是它不是仍然有效吗?这与'Collections#emptyList'中的模式相同,它也返回一个可以适合“任何”T的列表。 – Thilo