【问题标题】:Java Generic of Another generic另一个泛型的 Java 泛型
【发布时间】:2014-01-07 17:58:21
【问题描述】:

我有接口:

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,那为什么我必须声明 GenericDAO,而不仅仅是 GenericDAO

【问题讨论】:

    标签: java generics dao


    【解决方案1】:

    在 Java 中,必须指定每个泛型类型。你可以不指定任何类型,但你不能只指定一个。

    此外,每个泛型类型必须在声明中指定。如果你想拥有class GenericDAO&lt;T extends Identifable&lt;U&gt;&gt;,你必须像这样将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>
    

    这将迫使您在DogDAO 方法中编写getById 方法:

    Dog getById(String id);
    

    Dog 中的getId 方法返回Long,因此您的getById 方法int DogDAO 必须将Strings 与Longs 进行比较。这是正确的做法,但有点违反直觉。为DogDAO 使用带有Long 参数的getById 方法更有意义,因为Dogs ID 实际上是Longs。

    如果要将这两种类型绑定在一起,可以将GenericDAO类定义为:

    public abstract class GenericDAO<T extends Identifable<S>, S>
    

    您仍然需要指定第二个参数,但至少编译器可以帮助您确保类型匹配。

    【讨论】:

      【解决方案2】:

      试试这个:

      public abstract class GenericDAO<S extends Serializable, T extends Identifable<S>> {
          abstract T getByID(S id);
      }
      

      【讨论】:

      • 我想他已经知道这行得通,但你还没有回答他的问题。
      猜你喜欢
      • 2014-08-02
      • 1970-01-01
      • 2020-11-05
      • 2021-12-25
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2010-12-18
      • 2014-12-19
      相关资源
      最近更新 更多