[英]How to verify a generic type extends another class/interface in Java?
我有一个通用类型K,我想验证K是否实现接口Comparable。 这是我的代码:
public class HashMapVectorSimilarity<K> {
static public <K> double calculateSimilarity(HashMap<K, Double> hashMap1, HashMap<K, Double> hashMap2) {
if (Comparable.class.isAssignableFrom(K)) {//
}
}
但是代码不起作用。 我不想将所有K限制为实施Comparable。 我已经有另一个TreeMapVectorSimilarity类。 如果K实现接口Comparable,我将使用TreeMapVectorSimilarity类返回结果。
您认为我如何解决这个问题? 谢谢。
如果要强制使用只能使用实现Comparable
类型K
则可以在编译时检查它:
public class HashMapVectorSimilarity<K extends Comparable<K>> {
...
}
这是最简单的方法,可能也是最好的方法。
如果要进行运行时检查,由于类型为rasure ,则无法以编写方式进行检查。 Java中泛型的工作方式是编译器检查所有类型,但将其删除,因此它们在运行时不可用。
因此,如果要使运行时类型可用,则需要显式传递Class
对象:
static public <K> double calculateSimilarity(
HashMap<K, Double> hashMap1, HashMap<K, Double> hashMap2, Class<K> clazz) {
if (Comparable.class.isAssignableFrom(clazz)) {
...
}
}
或者,您可以将clazz
传递给构造函数并将其存储在对象中。
如Leri所述,将您的代码更改为:
public class HashMapVectorSimilarity<K extends Comparable<K>> {
}
如果没有在某个时候专门存储Class<K>
,就无法真正做到这一点(例如,将其作为参数传递给方法,或将其传递给构造函数并保存在字段中); 有关某些选项,请参见在运行时获取类的通用类型 。
如果哈希映射不为空,则可以通过获取键之一并获取其类来对其进行破解,但我强烈建议您反对。
最好的解决方案是确保该类型实现您感兴趣的接口,例如:
public class HashMapVectorSimilarity<K extends Comparable<K>> {
...
}
但是,如果您不愿意将所有K
限制为实现Comparable<K>
,那么您的下一个最佳选择是将类本身作为参数传递给某个地方-尽管在这种情况下,您应该真正问问自己HashMapVectorSimilarity
真正使非Comparable
类型的含义 。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.