我有2个接口: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() {
这样可以防止您在返回值上调用使用者方法,即,使这些方法不可调用(某种)。
但是,不建议在返回类型中使用通配符,因为那样便无法在呼叫站点摆脱通配符。