方法签名泛型中的java从此扩展而来

时间:2014-05-02 12:56:38

标签: java generics extends

这不起作用,因为this.class必须Tower,但我希望从Tower扩展的所有类都可以从当前Tower中分配ArrowTower 1}}或其他。

public Tower upgrade(Class<? extends this.class> c) {
    try {
        return c.getConstructor().newInstance();
    } catch (Exception e) {
        e.printStackTrace();
    }
    return null;
}

我可以这样检查,但我希望编译器说你错误的扩展层次结构或其他东西

if (!this.getClass().isAssignableFrom(c))
{
    return null;
}

我希望如此,因为有ArrowTowerFireArrowTower来自ArrowTower,并且有CannonTowerFireCannonTowerCannonTower延伸。但是如果想要升级ArrowTower,可以将其升级为CannonTower,但不应允许这样做。

请参阅:

    Tower t1 = new ArrowTower();
    t1 = t1.upgrade(FireArrowTower.class);

    Tower t2 = new CannonTower();
    t2 = t2.upgrade(Tower.class); // Here it musst be an Error

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

1 个答案:

答案 0 :(得分:1)

这是不可能的,因为松散地说,子类应该支持超类支持的所有内容(参见Liskov替换原则)。

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

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并不允许它。