繁体   English   中英

如何将子类实例分配给通用对象(扩展父对象)?

[英]How to assign child class instance to generic (extends parent) object?

我有一个这样定义的父类:

public abstract MyParent {

    public static <MP extends MyParent> MP getInstance(Object... params) {
        return new MyChild(params);
    }
}

MyChild扩展MyParent 问题是编译器不会让我返回新的孩子,因为“ MyChild无法转换为MP ”。 如果我在return之前return (MP) new MyChild(params);return (MP) new MyChild(params); ), return (MP) new MyChild(params);收到未经检查的强制转换警告。

正确的方法是什么?

MP可以是扩展MyParent的任何东西,但是MyChild不会成为MyParent的每个子类的子类。

我认为您的意图是让getInstance返回MyParent的实例,而不是使其返回通用MP。

自从你

有[三个] MyChilds,并且[]根据参数获得一个不同的Child

您面临一个基本挑战:方法的调用者如何知道期望的返回类型,并且编译器如何事先知道实际返回的对象的类型与调用者期望的类型兼容? 编译时类型的安全性绝对取决于后一种分析,没有这种分析,您想像中为避免强制转换而进行的任何操作都是混淆性的。

方法参数与结果类型之间的具体关系尚不清楚,但是如果它取决于参数类型之外的任何其他条件,那么您就可以完成。 在这种情况下,就无法避免在某处进行强制转换或等效转换。 然后,您更好的选择包括

  • 让方法返回MyParent ,并接受如果调用程序依赖于特定的子类型,则调用者将需要MyParent结果(但不是)。

  • 为每种实际的返回类型创建一个不同的名称的方法。 这样可以避免调用程序进行强制转换,但是如果给定的参数不对应于所调用方法的正确类型的对象,则可能需要提供例外。

当然,你也能够修改方法,以便返回类型基于类型的参数。 例如,您可能

  • 在方法参数中包括类型标记 但是,要使其用作强制转换等效项,该方法需要以某种方式将类型标记与其他参数关联,或使用它来真正选择返回类型,或将返回值强制为指定的类型。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM