为什么Java不接受泛型隐含的返回类型?

public class Role<A extends Actor> {
    protected A actor;
    protected A constructActor() {
        return new Actor();
    }
}

为什么这个 Java 代码不能编译?我的 IDE 告诉我,constructActor() 需要返回一个 A 类型,而不是一个 Actor 类型。但据我所知,我明确表示 A 将是一个 Actor 或一个 Actor 的扩展。那么为什么 Java 会这样呢?

编辑:

您可能会进一步帮助我了解“通用”工厂模式的想法:

实际上,constructActor() 方法并不打算总是返回一个 Actor 的实例(因此是受保护的访问),而是作为每个不必构造指定版本的 Actor 的子类的某种默认情况:

// the first two cases should construct specified versions of the Actor
public class HeroRole<HeroActor> {
    @Override protected HeroActor constructActor() {
        return new HeroActor();
    }
}
public class EnemyRole<EnemyActor> {
    @Override protected EnemyActor constructActor() {
        return new EnemyActor();
    }
}

// the following classes should construct a regular Actor by default:
public class AnimalRole<Actor> {
}
public class GhostRole<Actor> {
}

使用泛型的原因是 Role 的每个子类都尽可能指定它的 Actor 以防止强制转换。如您所见,Role 的子类需要构造 Actor 类(Hero、Enemy)的指定版本。但是对于其他类(Animal、Ghost),我想我可以按照我最初的想法来保存constructActor() 方法的实现。那没有用。在这种情况下,还有其他定义默认情况的方法吗?

回答

但据我所知,我明确表示 A 将是一个 Actor 或一个 Actor 的扩展。那么为什么 Java 会这样呢?

是的,A将是Actor或子类Actor- 但这是您想要的错误继承方向。

假设我们有一个Role<SpecialistActor>. 然后constructActor()应该返回 a SpecialistActor... 而 aSpecialistActor是 an Actor,一个普通的Actor(如 的结果new Actor()不是a SpecialistActor。这就像试图Object在声明为 return 的方法中返回对 的实例的引用String

public String constructString() {
    return new Object();
}

你不会期望编译,对吧?因此,将相同的推理应用于您的示例。


以上是为什么Java不接受泛型隐含的返回类型?的全部内容。
THE END
分享
二维码
< <上一篇
下一篇>>