Java通用的另一种通用
我有界面:
interface Identifable<T extends Serializable> {
T getID();
}
和实现这个的类:
public class Cat implements Identifable<Long> {
public Long getID(){...};
}
一切正常。 至今。 现在我想创建GenericDAO,为什么我不能创建它?:
public abstract GenericDAO<T extends Identifable<S>> {
T getByID(S id);
}
我只能将GenericDAO声明为:
public abstract GenericDAO<T extends Identifable, S> {
T getById(S id);
}
完整的课堂:
public CatDAO extends GenericDAO<Cat, Long> {
Cat getById(Long id);
}
但我认为这是无用的,因为我重复了信息。 我已经声明,Cat实现了Identifable <Long>,为什么我必须声明GenericDAO <Cat,Long>,而不仅仅是GenericDAO <Cat>?
在Java中,必须指定每个泛型类型。 你可以没有指定任何类型,但你不能没有指定一个。
此外, 每个泛型类型都必须在声明中指定。 如果你想让class GenericDAO<T extends Identifable<U>>
,你必须像这样将U
的泛型类型声明添加到你的类声明中(因为U
实际上是一个泛型类型):
public abstract class GenericDAO<T extends Identifable<U>, U>
以下是部分题目,但您可能会觉得它很有用。
我注意到在GenericDAO
的定义中,两个泛型类型并不相互关联。 这可能不是你想要的。
这里有两种泛型匹配的特定情况( Cat
和CatDAO
定义中的Long
类型)。 考虑这些声明:
public class Dog implements Identifable<Long>
public class DogDAO extends GenericDao<Dog, String>
这将迫使你写的getById
的方法DogDAO
方法:
Dog getById(String id);
您getId
的方法Dog
返回Long
让你getById
方法INT DogDAO
将不得不比较String
s到Long
秒。 这是有效的事情,但这有点违反直觉。 有一个getById
的方法DogDAO
,需要一个Long
的参数更有意义,因为Dog
小号ID是真正Long
秒。
如果您想将两种类型结合在一起,可以将GenericDAO
类定义为:
public abstract class GenericDAO<T extends Identifable<S>, S>
您仍然需要指定第二个参数,但至少编译器可以帮助您确保类型匹配。
尝试这个:
public abstract class GenericDAO<S extends Serializable, T extends Identifable<S>> {
abstract T getByID(S id);
}
链接地址: http://www.djcxy.com/p/76175.html