java in方法签名泛型就是从这一点扩展而来的

java in方法签名泛型就是从这一点扩展而来的,java,generics,extends,Java,Generics,Extends,这不起作用,因为This.class必须是Tower,但我希望从Tower扩展的所有类都可以从当前的Tower分配,比如箭头Tower或其他 public Tower upgrade(Class<? extends this.class> c) { try { return c.getConstructor().newInstance(); } catch (Exception e) { e.printStackTrace();

这不起作用,因为
This.class
必须是
Tower
,但我希望从
Tower
扩展的所有类都可以从当前的
Tower
分配,比如
箭头Tower
或其他

public Tower upgrade(Class<? extends this.class> c) {
    try {
        return c.getConstructor().newInstance();
    } catch (Exception e) {
        e.printStackTrace();
    }
    return null;
}
我希望如此,因为有一个
ArrowTower
和一个
firearowtower
ArrowTower
扩展而来,还有一个
cannonpower
和一个
FireCannonTower
cannonpower
扩展而来。但是,如果要升级
箭头塔
,可以将其升级为
CannonPower
,但这是不允许的

见:


对不起,我英语不好,我来自德国:D

这是不可能的,因为原则是,松散地说,子类应该支持超类支持的所有东西(另请参见替换原则)

让我举例说明。使用您描述的结构,您希望编译器接受:

Tower myTower = new Tower();
myTower.upgrade(ArrowTower.class)
。。但不是:

GunTower myTower = new GunTower();
myTower.upgrade(ArrowTower.class);
对吧??不过,这会带来麻烦。看:

Tower myTower = new GunTower();
myTower.upgrade(ArrowTower.class);

在这里,我们只是使“myTower”的类型不那么具体,现在您希望编译器突然不允许这个调用。这很奇怪,Java确实不允许这样做。

没有必要抨击德国人,即使你的英语很好:)为什么不升级(课堂提示:如果德国人觉得他们的英语不好,那么我应该觉得我的人的英语(法语…)真的不好。因为有一个ArrowTower和一个FireArrwoTower是从ArrowTower延伸而来的,还有一个CannonPower和一个FireCannonPower是从CannonPower延伸而来的。但是如果要升级一个ArrowTower,可以将其升级为CannonPower,但不应允许这样做,
upgrade()
Tower
中的一个方法,但您希望此方法在子类中表现不同,对吗?您是如何使用此方法的?如果您传递的是一个特定类,而不是动态获取的,那么处理泛型可能没有意义,您可以使用单独的方法。请查看我的更改,这必须是可能的
GunTower myTower = new GunTower();
myTower.upgrade(ArrowTower.class);
Tower myTower = new GunTower();
myTower.upgrade(ArrowTower.class);