条件断点错误 - 类型不实现选择器最大值和签名

arn*_*e.b 3 java eclipse

我正在尝试调试我的一段代码,其中Integer地图中的()值有时会出乎意料地高.

当我这样做

Collection<Integer> vals = newState.values();
int max = Collections.max(vals);
return newState; // breakpoint here
Run Code Online (Sandbox Code Playgroud)

我可以在return语句的行中设置条件断点,条件涉及max,例如max > 10.当我省略中间行并设置断点条件时Collections.max(vals) > 10,我在调试模式下得到一个运行时异常.

"原因:类型没有实现选择器最大值和签名(Ljava/util/Collection;)Ljava/lang/Comparable;"

我可以通过上面的代码片段得到我想要的东西,但我仍然想知道这里发生了什么.猜测可能是Collections方法未能意识到Integer确实具有可比性,我尝试了Collections.<Integer>max(v)一些(语法错误)变化,但没有成功.

axt*_*avt 5

Collections.max() 签名中有一个有趣的技巧:

public static <T extends Object & Comparable<? super T>> T max(Collection<? extends T> coll)
Run Code Online (Sandbox Code Playgroud)

如您所见,extends Object这里看起来多余.诀窍是在类型擦除期间T变为其第一个通用边界(即Object),因此该方法的实际擦除签名如下所示:

public static Object max(Collection coll)
Run Code Online (Sandbox Code Playgroud)

它是为了保持与此方法的预通用版本的二进制兼容性:针对预通用版本编译的代码期望返回类型Object,并且使用此技巧新版本满足其期望.

然而,正如你可以看到,调试器错误地假定erause那TComparable.也许这是调试器中的一个错误.