我有2个接口(interface):Data
和DBObject
。
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/