在做了一些阅读后,似乎可以使用&amp;运算符要求多个扩展:Class<T extends Class1 & Class2> classObj;
但是,我正在寻找一种在编译时强制执行“not”功能的方法。我有香蕉延伸水果的例子。但是,我正在追求以下内容:
public abstract class Fruit
{
public abstract String getFlavour();
}
public class Lemon extends Fruit
{
@Override
public String getFlavour()
{
return "sour";
}
}
public abstract class Banana extends Fruit
{
@Override
public String getFlavour()
{
return "very sweet!";
}
public abstract String getBananaRipeness();
}
public class UnripeBanana extends Banana
{
@Override
public String getBananaRipeness()
{
return "unripe";
}
}
...
public String methodThatTakesFruitClassButNotBanana( Class<? extends Fruit ! Banana> fruitClass )
{
Fruit fruit = fruitClass.newInstance();
return fruit.getFlavour();
}
...
methodThatTakesFruitClassButNotBanana( Lemon.class ); // I want this to compile.
methodThatTakesFruitClassButNotBanana( UnripeBanana.class ); // I want this not to compile.
显然Class<? extends Fruit ! Banana>
不是有效的语法。您建议在编译时强制执行此类型层次结构的方法是什么?
答案 0 :(得分:4)
public String methodThatTakesFruitClassButNotBanana
这与Liskov Substitution Principle完全相反,以及多态如何工作。自Banana extends Fruit
起,要求Fruit
的任何方法都接受Banana
。
如果必须,您需要检查动态类型并抛出异常,编译器无法为您执行此操作。