Java:不是通配符边界的运算符

时间:2013-02-06 01:39:26

标签: java bounded-wildcard

在做了一些阅读后,似乎可以使用&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>不是有效的语法。您建议在编译时强制执行此类型层次结构的方法是什么?

1 个答案:

答案 0 :(得分:4)

  

public String methodThatTakesFruitClassButNotBanana

这与Liskov Substitution Principle完全相反,以及多态如何工作。自Banana extends Fruit起,要求Fruit的任何方法都接受Banana

如果必须,您需要检查动态类型并抛出异常,编译器无法为您执行此操作。