我有以下课程:
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
这是错误,因为data
是type AbstractFruitData
。我可以强制转换,但是在Java中是否可以编写代码,在哪里setData
或getData
方法在编译时只能在AppleData上运行?
第二个问题:是否有任何设计模式可以用更好的体系结构代替类的这种结构?
您应该能够说服编译器允许您访问getGarden
通过插入T
到AbstractFruit<T>
中声明Fruit
,如下所示:
class Fruit<T extends FruitData> extends AbstractFruit<T> {
String colour; // ^
} // Here is the change --------------+
做出更改后,您的类将编译并运行良好(ideone上的演示)。
就问题的第二部分而言,管理并行类层次结构没有灵丹妙药。让调用者将类与其数据配对的方法非常合理,因为用户可以完全访问该类及其数据。
通过使用接口代替某些基类,您可能会获得一定的灵活性,但是最终,如果两个类需要彼此了解,则没有一种通用的方法可以将其抽象为层次结构中更高的类。
本文收集自互联网,转载请注明来源。
如有侵权,请联系[email protected] 删除。
我来说两句