我正在开发一个项目,其中一个要求是我们使用通用数据类型。(其他要求:抽象类,继承,保存/加载函数,聚合和组合)
我想我会创建一个库来填写所有要求,很难想出何时/何地使用通用数据类型然后很明显,如果我有一个类名为媒体的两个子类名为 Book 和 CD 长度为int(页面),CD的长度为double(分钟&秒)
我认为在Media中做这件事会有所帮助:
public abstract class Media<T>{
private T length;
//lots of other variables & methods here, took out for sake of cutting to the chase
public T getLength(){
return length;
}
public void setLength(T length){
this.length = length;
}
}
问题:
但现在的问题是,当它没有在getLength中接收一个类型时它如何返回一个类型,因此除非它以某种方式设置,否则它不知道它是哪种类型?或者一个解决方案是让每个子类在构造函数中调用此函数一次来设置它吗?
我可以在子类 Book 和 CD 中以某种方式覆盖private T length;
变量吗?只是设置它们的类型,以便getLength以它应该的方式运行,或者还有其他任何解决方案吗?
可以选择在其他地方使用通用数据类型,但我只是不知道哪些地方合适,我的教授们甚至不满足要求,所以他们告诉我他们如果他们会失败我认为某些事情“没有正确使用”或“不是一个好例子”,即使“礼仪”不是必需品。
答案 0 :(得分:1)
感谢Andy Turner的解决方案,以及其他人的贡献,但他给出了有帮助的答案,这就是:
我做了什么:
class Book extends Media{
...
}
class CD extends Media{
...
}
我应该添加的内容:
class Book extends Media<Integer>{
...
}
class CD extends Media<Double>{
...
}
答案 1 :(得分:1)
这是协变类型的好例子,Java 1.5或更高版本支持此行为。泛型是可选的,因为返回类型是协变的,但是如果需要可以添加,并且应该是相同的。
public class CovariantTest {
public static void main(String[] args) {
Media book = new Book();
assert book.getLength().getClass() == Integer.class;
Media cd = new Cd();
assert cd.getLength().getClass() == Double.class;
//Just for sake of being complete
assert book.getLength().getClass() == Number.class; // AssertionError
assert cd.getLength().getClass() == Number.class; // AssertionError
}
}
abstract class Media {
private Number length;
public Number getLength() {
return length;
}
}
class Book extends Media {
@Override
public Integer getLength() {
return 5;
}
}
class Cd extends Media {
@Override
public Double getLength() {
return 5.01;
}
}