Java泛型类型转换

3

以下是示例代码:

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<? extends Item> 是类型 BaseListAdapter<T>。编译器只是说他无法验证这个转换,所以你需要自己承担风险。 - Vincent van der Weele
请参考此链接,可能会有所帮助: https://dev59.com/onVC5IYBdhLWcg3wihqv - Debrup Majumdar
2个回答

6

您可能想要

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

这真的能解决问题吗?这里的 T 是否保证与类中使用的 T 相同?我不这么认为,如果该方法在与 MyClass 不同的类中。 - Rohit Jain
警告似乎仍然没有消失。 - sanbhat
@RohitJain:T 肯定是不同的。但它仍然有效吗?这与 Collections#emptyList 中的模式相同,该方法也返回一个可以适合“任何” T 的列表。 - Thilo
@Thilo。是的,如果您尝试执行类型转换,它也会给出未经检查的转换警告。 - Rohit Jain
这只会将一个潜在危险的转换推入方法中。在emptyList的情况下是安全的。但通常不是这样。所以我同意,类型可能需要以某种方式链接起来。我们需要看更多的代码。 - Thilo
显示剩余2条评论

0

这是因为BaseListAdapter接受任何继承自Item的类型,而你正在将一个具有任何类型的BaseListAdapter显式转换为具有类型T的BaseListAdapter,这不一定是相同的类型,因此会出现错误。

如果你想要修复它,那么你需要完全避免转换并使用Item进行管理,或者使BaseListAdapter处理T而不是某个未命名的类型? extends Item。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接