繁体   English   中英

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

[英]Why won't Java accept a return type thats implied by generics?

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 的实例(因此是受保护的访问),而是作为每个子 class 的某种默认情况,它不必构造指定版本的 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> {
}

Generics 的原因是 Role 的每个子 class 都尽可能指定其 Actor 以防止强制转换。 如您所见,角色的子类需要构造特定版本的 Actor class(英雄,敌人)。 但是对于其他类(Animal、Ghost),我想我可以按照我最初的想法保存constructActor() 方法的实现。 那没有用。 在这种情况下是否有任何其他方式来定义默认情况?

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

是的, A将是ActorActor的子类 - 但对于您想要的,这是 inheritance 的错误方向。

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

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

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

A可以是Actor或 Actor 的子类(或子接口)。

假设你写:

Role<SubActor> role = new Role<> ();
SubActor actor = role.constructActor ();

这应该通过编译(基于您的Role class 及其泛型类型参数A的定义),但是您的constructActor()方法总是返回一个Actor ,它并不总是一个SubActor

如果您的constructActor()方法总是返回一个Actor的实例,您只需将其返回类型更改为Actor 没有必要使用A

暂无
暂无

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

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