Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/eclipse/8.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 条件断点错误-类型未实现选择器最大值和签名_Java_Eclipse - Fatal编程技术网

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()) {
           // 
        }
    }
}