【发布时间】:2016-09-21 16:03:13
【问题描述】:
我正在做一个项目,其中一个要求是我们使用通用数据类型。(其他要求:抽象类、继承、保存/加载函数、聚合和组合)
我想我会创建一个库来满足所有要求,很难想出何时/何地使用通用数据类型的好主意,然后很明显,如果我有一个类称为 Media 和两个子类称为 Book 和 CD 书的长度是 int(pages),CD 的长度是 double(minutes & seconds )
我认为在 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 以它应该的方式运行,还是有其他解决方案?
可以选择在其他地方使用通用数据类型,但我只是不知道在哪里合适,我的教授甚至在超出要求时都在吹毛求疵,所以他们让我知道,如果他们让我失望了认为某些东西“使用不当”或“不是一个好例子”,即使“礼仪”不是必需的。
【问题讨论】:
-
为什么不使用
Media作为接口? -
它没有收到
getLength()中的类型,但它在您创建Media<Something>实例时收到了一个。您能否展示一个您打算在其中使用此Media类的代码示例? -
@MuratK。抽象类是一个要求
-
好吧,这些类将被指定为
class Book extends Media<Integer>和class CD extends Media<Double>。此外,它不会返回int和double,它会返回Integer和Double。 -
为了使
Media有用,它需要可用作伞形类。如果您打算稍后在Book和CD的混合列表中使用getLength()做很多事情,您应该将Media声明为public class Media<T extends Number>
标签: java generics return abstract