Java继承:在编译时验证子类类型



比方说,我有一个简单的类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的参数来实现这一点?我不想在Fruit的每个子类中覆盖isEqualPrice

一种可能的解决方案是:

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

但它只会在运行时报告类是否相同,并且用户无法通过监视方法签名来实现正确的参数类型。有什么方法可以在编译时检测到这一点吗?

NOTE:我认为enumcompareTo方法就是这样一种方法,因为每个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>{
}

最新更新