我有以下课程:
class AbstractFruitData {
int size;
int weight;
}
class FruitData extends AbstractFruitData {
String name;
}
class AppleData extends FruitData {
String garden;
String getGarden() {
return garden;
}
}
class AbstractFruit<T extends AbstractFruitData> {
T data;
void setData(T data) {
this.data = data;
}
T getData() {
return data;
}
}
class Fruit<T extends FruitData> extends AbstractFruit<AbstractFruitData> {
String colour;
}
class Apple extends Fruit<AppleData> {
}
如果我写下面的代码:
Apple apple = new Apple();
apple.setData(new AppleData());
apple.getData().getGarden(); <-- error
这是错误,因为数据类型为AbstractFruitData.我可以强制转换,但是在Java中是否可以编写代码,其中setData或getData方法在编译时只能在AppleData上运行?
第二个问题:是否有任何设计模式,这种类的结构可以被更好的架构所取代?
最佳答案 你应该能够说服编译器让你通过将T插入AbstractFruit< T>来访问getGarden.在Fruit的声明中,像这样:
class Fruit<T extends FruitData> extends AbstractFruit<T> {
String colour; // ^
} // Here is the change --------------+
一旦你做了这个改变,你的类将编译并运行正常(demo on ideone).
至于问题的第二部分,管理并行类层次结构没有灵丹妙药;让调用者将数据与数据配对的方法非常合理,因为用户可以完全访问类及其数据.
您可以通过使用接口代替某些基类来获得一些灵活性,但最终如果两个类需要相互了解,则没有通用的方法将其抽象为层次结构中较高层的类.