繁体   English   中英

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

[英]Java: not operator for wildcard bounds

阅读后,似乎可以使用&运算符进行多个扩展: Class<T extends Class1 & Class2> classObj;

但是,我正在寻找一种在编译时强制执行“非”功能的方法。 我有香蕉延伸水果的例子。 但是,我遵循以下原则:

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> Class<? extends Fruit ! Banana> Class<? extends Fruit ! Banana>是无效的语法。 您建议采用什么方法在编译时强制这种类型层次结构?

公共String方法ThatTakesFruitClassButNotBanana

这与Liskov替代原理以及多态性的工作原理完全相反。 由于Banana extends Fruit因此要求采用Fruit任何方法都必须接受Banana

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

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM