我有2个接口:p
和Data
。
DBObject
。
它们是类DBObject extends Data
中的泛型。
如何避免将ITree
投射到ITree<DBObject>
到ITree<Data>
?
ClassCastException
答案 0 :(得分:2)
这里没有类强制转换异常,类型编译器不兼容错误。
您可以进行未经检查的演员表:
return (ITree<Data>) (ITree<?>) structure;
,但是您需要确保完全了解编译器为何认为此操作不安全(它将发出警告),并能够证明它实际上是安全的。以及重要的是 document 为什么安全。
仅当ITree<T>
没有接受涉及T
的参数的可调用方法时,这才是安全的(除非那些方法不使用涉及类型T
的事物来更改实例的状态) )。
例如,Supplier<T>
可以安全地强制转换为Supplier<ParentOfT>
,因为它没有接受任何参数的方法。
您可以将方法的返回类型设置为有界通配符:
public ITree<? extends Data> getDataStructure() {
这可防止您调用返回值上的使用者方法,即,使这些方法不可调用(某种)。
但是,不建议在返回类型中使用通配符,因为那样一来,您就无法在呼叫站点摆脱通配符。