Java 条件断点错误-类型未实现选择器最大值和签名
我试图调试我的一段代码,其中映射中的(Java 条件断点错误-类型未实现选择器最大值和签名,java,eclipse,Java,Eclipse,我试图调试我的一段代码,其中映射中的(Integer)值有时会达到惊人的高 当我这么做的时候 Collection<Integer> vals = newState.values(); int max = Collections.max(vals); return newState; // breakpoint here Collection vals=newState.values(); int max=集合的最大值(VAL); 返回newState;//断点在这里 我可以在r
Integer
)值有时会达到惊人的高
当我这么做的时候
Collection<Integer> vals = newState.values();
int max = Collections.max(vals);
return newState; // breakpoint here
Collection vals=newState.values();
int max=集合的最大值(VAL);
返回newState;//断点在这里
我可以在return语句的行上设置一个条件断点,条件涉及max,例如max>10
。当我省略中间一行并将断点条件设置为Collections.max(vals)>10
时,在调试模式下会出现运行时异常
“原因:类型未实现选择器max和签名(Ljava/util/Collection;)Ljava/lang/Comparable;”
我可以用上面的代码片段得到我想要的,但我仍然想知道这里发生了什么。猜测可能是Collections方法没有意识到整数确实是可比较的,我尝试了Collections.max(v)
和一些(糟糕的语法)变体,但没有成功。Collections.max()
在其签名中有一个有趣的技巧:
public static <T extends Object & Comparable<? super T>> T max(Collection<? extends T> coll)
它用于保持与此方法的预泛型版本的二进制兼容性:根据预泛型版本编译的代码期望返回类型为Object
,使用此技巧,新版本满足了它的期望
但是,正如您所看到的,调试器错误地假设
T
的使用是可比的。也许这是调试器中的一个bug。大多数情况下,在使用类引用前缀调用同一范围内的静态方法时,都会发生这种情况
范例
public final class SomeUtilClass{
public static boolean utilMethod1() {
//
}
public static boolean utilMethod2() {
if(SomeUtilClass.utilMethod1()) {
//
}
}
}
在上面的例子中,在utilMethod2中,我们使用了utilMethod1和prfixed类名(即SomeUtilClass.utilMethod1()),这是不必要的,因为两者都在同一范围内,这就像调用本地私有方法一样
在这种情况下,不需要prifix SomeUtilClass.”,如果在if条件中删除“SomeUtilClass.”prfix,则在调试时将导致此类问题。它将正常工作。因为utilMethod2不需要任何类引用来调用utilMethod1
public final class SomeUtilClass{
public static boolean utilMethod1() {
//
}
public static boolean utilMethod2() {
if(SomeUtilClass.utilMethod1()) {
//
}
}
}