繁体   English   中英

如何验证泛型在Java中扩展了另一个类/接口?

[英]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.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM