比方说,我有一个简单的类Fruit
,定义如下:
public class Fruit {
int price;
public boolean isEqualPrice(Fruit object) {
return (object.price == price);
}
}
现在,Fruit
有几个子类,如Apple
、Orange
、Mango
等。我希望只有当这些子类相同时,方法isEqualPrice
才有效。例如,Apple.isEqualPrice(Apple)
是有效的,但Apple.isEqualPrice(Orange)
不是。我应该如何定义isEqualPrice
的参数来实现这一点?我不想在Fruit
的每个子类中覆盖isEqualPrice
。
一种可能的解决方案是:
public boolean isEqualPrice(Fruit object) {
if(this.getClass() != object.getClass())
throw new IllegalArgumentException();
return (object.price == price);
}
但它只会在运行时报告类是否相同,并且用户无法通过监视方法签名来实现正确的参数类型。有什么方法可以在编译时检测到这一点吗?
NOTE:
我认为enum
的compareTo
方法就是这样一种方法,因为每个enum
都有这种方法,一种类型的enum
无法与其他类型相比。但我不明白它是如何实现的。
将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> {
...
}
您当然可以:
class Fruit <T extends Fruit>{
int price;
public boolean isEqualPrice(T object1) {
return (object1.price == price);
}
}
class Mango extends Fruit<Mango>{
}