1

说,我有一个简单的类Fruit定义如下:

public class Fruit {
    int price;

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

现在,有几个子类,Fruit例如AppleOrangeMango。我希望该方法isEqualPrice仅在这些子类相同时才有效。例如,Apple.isEqualPrice(Apple)将是有效的,但Apple.isEqualPrice(Orange)不会是。我应该如何定义参数 isEqualPrice来实现这一点?我不想isEqualPriceFruit.

一种可能的解决方案可能是:

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

但是它只会在运行时报告类相同或不同,并且用户无法通过查看方法签名来实现正确的参数类型。有没有办法在编译时检测到这一点?

NOTE:我认为compareTomethod ofenum就是这样一种方法,因为每个enum人都有这种方法,并且一种类型enum不能与其他类型相比。但我无法理解它是如何实现的。

4

2 回答 2

2

使 Fruit 泛型,或添加 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 回答