我正在尝试调试我的一段代码,其中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)一些(语法错误)变化,但没有成功.
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那T是Comparable.也许这是调试器中的一个错误.
| 归档时间: |
|
| 查看次数: |
4874 次 |
| 最近记录: |