java - 类型转换泛型类

标签 java syntax

我有2个接口(interface):DataDBObject

DBObject extends Data 。 它们是类 ITree 中的泛型.

如何转换 ITree<DBObject>ITree<Data>避免ClassCastException

private ITree<DBObject> structure; 

public ITree<Data> getDataStructure() {
    return (ITree<Data>) structure;
}

最佳答案

这里不会出现类转换异常,而是会出现不兼容类型编译器错误。

您可以进行未经检查的转换:

return (ITree<Data>) (ITree<?>) structure;

但是你需要确保你完全理解为什么编译器认为这是不安全的(它会发出警告),并且能够证明它实际上是安全的;而且,重要的是,记录为什么它是安全的。

只有在 ITree<T> 的情况下这才是安全的没有可调用的方法接受涉及 T 的参数(除非这些方法不使用涉及类型 T 的事物更改实例的状态)。

例如,Supplier<T>可以安全地转换为 Supplier<ParentOfT> ,因为它没有接受任何参数的方法。

您可以将方法的返回类型设置为有界通配符:

public ITree<? extends Data> getDataStructure() {

这会阻止您在返回值上调用消费者方法,即它使这些方法不可调用(某种程度上)。

但是,不鼓励在返回类型中使用通配符,因为这样您就无法在调用站点删除该通配符。

关于java - 类型转换泛型类,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/57752712/

相关文章:

java - JComboBox 在多个表格单元格之间共享自动选择当前选定的项目

java - 点后显示最多 X 位数字

java - LinkedHashMap 的内部实现与 HashMap 实现有何不同?

mysql - 逗号分隔的连接和MySQL中的语法连接有什么区别?

java - maven-compiler-plugin 在 linux 上坏了?

java - 使用 Spring Data JDBC 在 Postgresql 中映射 Java 枚举

java - 模糊的条件 Java 语法

python - bs4 中 .find() 的正确语法是什么?

php - 从 PHP 文件中删除结束标记的理由

ruby-on-rails - rails : Multiple parameters before do?