我遇到了泛型方法的问题,因为我将我的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)
提前致谢!
答案 0 :(得分:0)
evaluate
期望知道相同类型的参数,可以与自身进行比较,但这不是这里的情况。
答案 1 :(得分:0)
您的通用方法有两个条件:
但是,您传递的两个参数严格来说不是同一类型。其中一个是原始的Comparable对象(其基类型为Object),另一个是Comparable,它不是原始的,但具有未知的基类型。
实际上你可以将一个Integer分配给b,并且它与原始的Comparable并不完全兼容。
使用a.compareTo(b)
不会导致编译时错误,因为a
是一个原始的Comparable,它将接受任何Comparable对象但会认为它是Comparable而b
可以是施放到Object
。这就是原始类型的工作原理。如果两个对象不匹配,则只会出现警告和运行时错误。
但是,使用b.compareTo(a)
会导致编译时错误,因为已知b具有基本类型,但目前还不知道它是什么。所以不知道Comparable<Object>
是否可以投射到它上面。