加入收藏 | 设为首页 | 会员中心 | 我要投稿 李大同 (https://www.lidatong.com.cn/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 编程开发 > Java > 正文

Java Generic of Another generic

发布时间:2020-12-15 02:58:26 所属栏目:Java 来源:网络整理
导读:我有界面: interface IdentifableT extends Serializable { T getID();} 和实现这个的类: public class Cat implements IdentifableLong { public Long getID(){...};} 一切正常.至今.现在我想创建GenericDAO,为什么我不能创建它?: public abstract Gene
我有界面:
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< Cat,Long>,而不仅仅是GenericDAO<猫> ?

解决方法

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

此外,必须在声明中指定每个泛型类型.如果你想让类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>

这会强制你在DogDAO方法中编写getById方法:

Dog getById(String id);

Dog中的getId方法返回一个Long,因此你的getById方法在DogDAO中必须将Strings与Longs进行比较.这是有效的事情,但它有点违反直觉.使用DogDAO的getById方法获取Long参数更有意义,因为Dogs ID实际上是Longs.

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

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

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

(编辑:李大同)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

    推荐文章
      热点阅读