铸造通用类

时间:2019-09-02 07:08:19

标签: java syntax

我有2个接口:pData

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

如何避免将ITree投射到ITree<DBObject>ITree<Data>

ClassCastException

1 个答案:

答案 0 :(得分:2)

这里没有类强制转换异常,类型编译器不兼容错误。

您可以进行未经检查的演员表:

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

,但是您需要确保完全了解编译器为何认为此操作不安全(它将发出警告),并能够证明它实际上是安全的。以及重要的是 document 为什么安全。

仅当ITree<T>没有接受涉及T的参数的可调用方法时,这才是安全的(除非那些方法不使用涉及类型T的事物来更改实例的状态) )。

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

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

public ITree<? extends Data> getDataStructure() {

这可防止您调用返回值上的使用者方法,即,使这些方法不可调用(某种)。

但是,不建议在返回类型中使用通配符,因为那样一来,您就无法在呼叫站点摆脱通配符。

相关问题