这不起作用,因为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;
}
我希望如此,因为有ArrowTower
和FireArrowTower
来自ArrowTower
,并且有CannonTower
和FireCannonTower
从CannonTower
延伸。但是如果想要升级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
答案 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并不允许它。