- iOS/Objective-C 元类和类别
- objective-c - -1001 错误,当 NSURLSession 通过 httpproxy 和/etc/hosts
- java - 使用网络类获取 url 地址
- ios - 推送通知中不播放声音
我有界面:
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);
}
并完成类(class):
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
的定义中两个通用类型彼此不相关。这可能不是您想要的。
这里是两个泛型匹配的特殊情况(Long
和 Cat
定义中的 CatDAO
类型)。考虑拥有这些声明:
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
s ID 实际上是 Long
如果你想把这两种类型联系在一起,你可以定义 GenericDAO
分类为:
public abstract class GenericDAO<T extends Identifable<S>, S>
您仍然必须指定第二个参数,但至少编译器可以帮助您确保类型匹配。
关于另一个泛型的 Java 泛型,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/20677077/
我是一名优秀的程序员,十分优秀!