java泛型 - 类型T中的方法evaluate(T,T)不适用于参数(Comparable,Comparable <capture#11-of?=“”>)</capture#11-of>

时间:2014-10-22 17:57:28

标签: java

我遇到了泛型方法的问题,因为我将我的java版本升级到8。 电话如下:

Operator o;
Comparable a;
Comparable<?> b;
boolean match = o.evaluate(a, b)

和方法

public enum Operator{

    public <T extends Comparable<T>> boolean evaluate(T value1, T value2) {

        if (value1 == null && value2 != null) {
            return false;
        }

        switch (this) {
        //some code here
        }     
    }
}

例外是: 类型为Operator的方法evaluate(T,T)不适用于参数(Comparable,Comparable)

提前致谢!

2 个答案:

答案 0 :(得分:0)

evaluate期望知道相同类型的参数,可以与自身进行比较,但这不是这里的情况。

答案 1 :(得分:0)

您的通用方法有两个条件:

  1. 它的返回类型相对于自身扩展了Comparable接口。
  2. 它的两个参数(和返回类型)都是相同的类型。
  3. 但是,您传递的两个参数严格来说不是同一类型。其中一个是原始的Comparable对象(其基类型为Object),另一个是Comparable,它不是原始的,但具有未知的基类型。

    实际上你可以将一个Integer分配给b,并且它与原始的Comparable并不完全兼容。

    使用a.compareTo(b)不会导致编译时错误,因为a是一个原始的Comparable,它将接受任何Comparable对象但会认为它是Comparable而b可以是施放到Object。这就是原始类型的工作原理。如果两个对象不匹配,则只会出现警告和运行时错误。

    但是,使用b.compareTo(a)会导致编译时错误,因为已知b具有基本类型,但目前还不知道它是什么。所以不知道Comparable<Object>是否可以投射到它上面。