当前位置: 首页 > 知识库问答 >
问题:

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

韦寒
2023-03-14

我有一个泛型类型K,我想验证K是否实现了接口可比性。这是我的代码:

public class HashMapVectorSimilarity<K> {
    static public <K> double calculateSimilarity(HashMap<K, Double> hashMap1, HashMap<K, Double> hashMap2) {
        if (Comparable.class.isAssignableFrom(K)) {//
                  }
       }

但是代码不起作用。我不想将所有K限制为实现可比性。我已经有了另一个TreeMapVector相似度类。如果K实现了接口可比性,我将使用TreeMapVector相似度类返回结果。

你认为我如何能解决这个问题?谢了。

共有3个答案

嵇丰
2023-03-14

如果不专门存储一个< code >类,就无法真正做到这一点

如果哈希映射不是空的,您可以通过获取一个键并获取其类来破解它,但我强烈建议不要这样做。

最好的解决方案是确保该类型实现您感兴趣的接口,如有可能,例如:

public class HashMapVectorSimilarity<K extends Comparable<K>> {
    ...
}

如果您不愿意将所有K限制为实现可比

夏侯涵映
2023-03-14

如Leri所述,将您的代码改为:

public class HashMapVectorSimilarity<K extends Comparable<K>> {
}
熊哲圣
2023-03-14

如果希望强制只有实现< code>Comparable的类型< code>K才能使用,可以在编译时检查它:

public class HashMapVectorSimilarity<K extends Comparable<K>> {
  ...
}

这是最简单的,也可能是最好的。

如果需要运行时检查,则无法按编写的方式执行,因为类型擦除。泛型在Java中的工作方式是编译器检查所有类型,但删除它们,因此它们在运行时不可用。

因此,如果希望运行时类型可用,则需要显式传入<code>类</code>对象:

    static public <K> double calculateSimilarity(
        HashMap<K, Double> hashMap1, HashMap<K, Double> hashMap2, Class<K> clazz) {
      if (Comparable.class.isAssignableFrom(clazz)) {
        ...
      }
    }

或者,您可以将< code>clazz传入构造函数,并将其存储在对象内部。

 类似资料:
  • 问题内容: 我正在学习Java,并且希望将自己的课堂变成可观察的课堂。 但是我已经有了它扩展了另一个类。 我该怎么办? 问题答案: 我建议避免完全使用该类,而应 定义事件特定的侦听器和相应的事件定义 。然后在您的类中定义一个侦听器列表,以及添加和删除侦听器以及向其传播事件的方法(请参见下文)。 强制您使用它来表示事件,然后使用来检查事件类型,这是一种丑陋的非OO方法,并使代码更难以理解。如果查看j

  • 问题内容: 在Java中,我该如何确定类扩展了哪些类? 会做我需要的吗? 问题答案: 该方法将失败,因为它的直接超类不是,而是。宁可使用。

  • 问题内容: 您如何进行这项工作: 不做 编辑 为什么这不起作用? 我正在将编译器消息标记为错误。 问题答案: Reimeus已经指出,您在编辑中要求的内容是不可能的。我只想扩展一下原因。 人们会认为您可以使用以下内容: 实际上,这就是我第一次看到这篇文章时想到的。但这实际上会导致编译器错误: 类型变量不能跟其他界限 为了帮助我解释原因,我想引用Victor Rudometov在OracleBlog

  • 问题内容: 我收到一个错误,程序中有这个结构 错误指向Circle扩展Shapes < T >类,其中指出“ T无法解析为类型”。如果将T设置为字符串,错误将消失,但这也意味着我只能使用一种数据类型。我应该在<>中放入什么,以便可以使用任何数据类型(字符串,整数,双精度型等),或者这样做是错误的? 问题答案: 有两个不同的概念。当你写 这意味着您正在创建一个类,该类在实例化时将被某个类参数化。您不

  • 问题内容: 我目前正在通过处理rosalind问题(基本上是一堆与生物信息学相关的代码katas)来学习Go 。 我目前用一种类型代表一条DNA链: 我最初的原因是封装字节片,所以我知道它只包含代表核苷酸的字节:。我意识到这显然没有被保证,因为我可以这样做: 并且不再保证我的dna链包含一个字节数组,其中只有这四个字节中的元素。 由于我的结构仅包含一个字节数组,因此这样做是更好/更理想的方法: 还

  • 问题内容: 如何测试是否是的子类? 问题答案: 您是否在寻找: