0

いくつか読んだ後、 & 演算子を使用して複数の拡張を要求できるようです。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>有効な構文ではありません。コンパイル時にこの種の型階層を適用するには、どのようなアプローチをお勧めしますか?

4

1 に答える 1

4

public String methodThatTakesFruitClassButNotBanana

これは、リスコフの置換原理とポリモーフィズムの仕組みの正反対です。を受け取るメソッドは .を受け入れるというBanana extends Fruit要件があるためです。FruitBanana

必要に応じて、動的型をチェックして例外をスローする必要がありますが、コンパイラはこれを行うことができません。

于 2013-02-06T01:57:49.747 に答える