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

如何验证泛型类型在Java中扩展了另一个类/接口?,java,generics,interface,Java,Generics,Interface,我有一个泛型类型K,我想验证K是否实现了可比较的接口。 这是我的密码: public class HashMapVectorSimilarity<K> { static public <K> double calculateSimilarity(HashMap<K, Double> hashMap1, HashMap<K, Double> hashMap2) { if (Comparable.class.isAssignab

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

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

公共类HashMapVector相似性{
静态公共双重计算相似性(HashMap hashMap1、HashMap hashMap2){
if(可比类isAssignableFrom(K)){//
}
}
但是代码不起作用。 我不想将所有K限制为实现Comparable。我已经有了另一个TreeMapVectorSimilarity类。如果K实现了interface Comparable,我将使用TreeMapVectorSimilarity类返回结果

你认为我怎样才能解决这个问题? 谢谢。

如所述,请将代码更改为:

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

公共类HashMapVector相似性{
}
将代码更改为:

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

公共类HashMapVector相似性{
}

如果不在某个点专门存储一个
类(例如,将其作为参数传递给方法,或将其传递给构造函数并将其保存在字段中),就无法真正做到这一点;请参阅此处的一些选项

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

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

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

公共类HashMapVector相似性{
...
}

但是,如果您不愿意将所有
K
限制为实现
compariable
,那么下一个最佳选择就是将类本身作为参数传递到某个地方——尽管在这种情况下,您应该问问自己,您的
HashMapVectorComparity
对于非
compariable
类型是否有意义。

<如果不在某个点专门存储
(例如,将其作为参数传递给方法,或将其传递给构造函数并将其保存在字段中),则无法执行此操作;请参阅此处的一些选项

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

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

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

公共类HashMapVector相似性{
...
}

但是,如果您不愿意将所有
K
限制为实现
compariable
,那么下一个最佳选择就是将类本身作为参数传递到某个地方——尽管在这种情况下,您应该问问自己,您的
HashMapVectorComparity
对于非
compariable
类型是否有意义。

<要强制执行只能使用实现可比较的
类型
K
,可以在编译时进行检查:

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

或者,您可以将
clazz
传递到构造函数中,并将其存储在对象中。

如果您希望强制执行只有
K
类型才能用于实现
可比的
,您可以在编译时检查它:

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

或者您可以将
clazz
传递到构造函数中,并将其存储在对象中。

公共类HashMapVectorSimilarity
编译器将为您检查。另外,我强烈建议您首先熟悉java语法。:)谢谢,但我希望类型K也可以是无法实现类似接口的东西。@SANDSOFTIME然后您必须将
作为参数传递给函数(或者传递给构造函数并将其存储为字段;请参阅我答案中的链接以获取此处的选项和示例),但您应该问问自己
HashMapVectorSimilarity
对于非
可比的
对象是否有意义(很好,但是请确保你考虑它)。<代码>公共类HasMaVijava相似性和编译器将检查它。我也强烈推荐首先熟悉Java语法。谢谢,但我希望类型K也可以是无法实现可比接口的。@SANDSOFTIME然后您必须将
Class
作为参数传递给函数(或传递给构造函数并将其存储为字段;有关选项和示例,请参阅我答案中的链接)但是,你应该问问自己,<代码> HasMaVixCurrase> <代码>对于非<代码>可比的< /Cord>对象(这很有可能,但请确保考虑一下)是有意义的。。非常感谢!这是我想要的。要获得最佳结果,请使用
非常感谢!这是我想要的。要获得最佳结果,请使用
要获得最佳结果,请使用
要获得最佳结果,请使用
要获得最佳结果请使用