1

Fruitたとえば、次のように定義された単純なクラスがあります。

public class Fruit {
    int price;

    public boolean isEqualPrice(Fruit object) {
        return (object.price == price);         
    }
}

現在、、Fruitなどのサブクラスがいくつかあります。これらのサブクラスが同じである場合にのみ、メソッドを有効にする必要があります。たとえば、は有効ですが、そうではありません。これを達成するためのパラメータをどのように定義する必要があります か?のすべてのサブクラスでオーバーライドしたくありません。AppleOrangeMangoisEqualPriceApple.isEqualPrice(Apple)Apple.isEqualPrice(Orange)isEqualPriceisEqualPriceFruit

考えられる解決策の1つは次のとおりです。

public boolean isEqualPrice(Fruit object) {
        if(this.getClass() != object.getClass())
            throw new IllegalArgumentException();
        return (object.price == price);         
    }

ただし、クラスは実行時だけでなく同じであると報告され、ユーザーはメソッドのシグネチャを監視して正しいパラメータタイプを実現する方法がありません。コンパイル時にこれを検出する方法はありますか?

NOTE:compareToの方法enumはそういう方法だと思います。誰もenumがこの方法を持っていて、あるタイプはenum他のタイプと比較することができないからです。しかし、それがどのように実装されているのか理解できませんでした。

4

2 に答える 2

2

Fruitをジェネリックにするか、フルーツのジェネリックサブクラスを追加して、そこからApple、Orangeなどを派生させます。

class Fruit {
   ...
}

class FruitGeneric<T extends Fruit> extends Fruit {
    public boolean isEqualPrice (T otherFruit) {
        ...
    }
}

class Apple extends FruitGeneric<Apple> {
   ...
}

class Orange extends FruitGeneric<Orange> {
   ...
}
于 2012-08-30T14:27:23.617 に答える
1

あなたは確かにできる:

class Fruit <T extends Fruit>{
    int price;
    public boolean isEqualPrice(T object1) {
        return (object1.price == price);
    }
}

class Mango extends Fruit<Mango>{

}
于 2012-08-30T14:50:30.777 に答える