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的定义中,两个泛型类型并不相互关联。 这可能不是你想要的。

这里有两种泛型匹配的特定情况( CatCatDAO定义中的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

上一篇: Java Generic of Another generic

下一篇: REQUEST and Transactions in Django 1.6