为什么赢了';Java是否接受泛型隐含的返回类型? 公共类角色{ 保护一个演员; 受保护的构造函数(){ 返回新的Actor(); } }

为什么赢了';Java是否接受泛型隐含的返回类型? 公共类角色{ 保护一个演员; 受保护的构造函数(){ 返回新的Actor(); } },java,generics,Java,Generics,为什么这个Java代码不能编译?我的IDE告诉我,constructActor()需要返回一个A类型,而不是一个Actor类型。但据我所知,我明确表示A将是演员或演员的延伸。那么为什么Java会这样做呢 编辑: 您可以帮助我进一步了解“通用”工厂模式的概念: constructActor()方法实际上并不打算总是返回Actor的实例(因此是受保护的访问),而是作为每个不必构造Actor的指定版本的子类的某种默认情况: public class Role<A extends Actor>

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

编辑:

您可以帮助我进一步了解“通用”工厂模式的概念:

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

public class Role<A extends Actor> {
    protected A actor;
    protected A constructActor() {
        return new Actor();
    }
}
//前两种情况应该构造Actor的指定版本
公共类角色{
@重写受保护的HeroActor构造函数(){
返回新的HeroActor();
}
}
公共类EnemyRole{
@重写受保护的EnemyActor构造函数(){
返回新的EnemyActor();
}
}
//默认情况下,以下类应构造常规参与者:
公共类动物角色{
}
公共类GhostRole{
}
之所以使用泛型,是因为角色的每个子类都尽可能地了解其参与者,以防止强制转换。正如您所见,角色的子类需要构造Actor类的指定版本(英雄、敌人)。但是对于其他类(Animal、Ghost),我认为可以按照我最初的想法来保存constructActor()方法的实现。那没用。在这个场景中,有没有其他方法来定义默认情况

但据我所知,我明确表示A将是演员或演员的延伸。那么为什么Java会这样做呢

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

假设我们有一个
角色
。然后
constructActor()
应该返回一个
specialActor
。。。虽然
specialActor
Actor
,但普通的
Actor
(如
newactor()
)不是
specialActor
。这就像在声明为返回字符串的方法中尝试返回对对象实例的引用一样:

公共字符串constructString(){
返回新对象();
}

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

A
可以是
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-Role=新角色();
子角色actor=role.constructActor();
这应该通过编译(基于
角色
类的定义及其泛型类型参数
A
),但是
constructActor()
方法总是返回一个
Actor
,它并不总是
子Actor

如果您的
constructActor()
方法总是返回
Actor
的实例,那么您应该将其返回类型更改为
Actor
。无需使用
A

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