我有界面:
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>
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>
您仍然必须指定第二个参数,但至少编译器可以帮助您确保类型匹配.
原文地址:https://www.jb51.cc/java/128388.html
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。