我有2个接口: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() {


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

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

09-27 21:41