static Class<?> comparableClassFor(Object x) {
if (x instanceof Comparable) { // 首先检查 x 是否可以转型为 Comparable
Class<?> c; Type[] ts, as; Type t; ParameterizedType p;
if ((c = x.getClass()) == String.class) // 如果类型是 String 则直接返回,因为 String 是泛型自限定的
return c;
if ((ts = c.getGenericInterfaces()) != null) {
for (int i = 0; i < ts.length; ++i) {
if (((t = ts[i]) instanceof ParameterizedType) &&
((p = (ParameterizedType)t).getRawType() ==
Comparable.class) &&
(as = p.getActualTypeArguments()) != null &&
as.length == 1 && as[0] == c) // type arg is c
return c;
}
}
}
return null;
}
这个函数里的逻辑大概都看懂了,就一个地方,为什么一定要加 as.length == 1 呢?
我想之所以要判断 as.length == 1,是因为 length 确实可能为 0,但如果前面的判断都通过了,那就说明尖括号肯定有东西了啊,而且 Comparable 的接口定义里,类型参数就一个啊,那就直接 as[0] == c 就好了啊,不用判断 as.length == 1 了啊?
还是说真的有那种情况,就算前面的判断都通过了,as.length 还是可能为 0 吗?
这是一个专为移动设备优化的页面(即为了让你能够在 Google 搜索结果里秒开这个页面),如果你希望参与 V2EX 社区的讨论,你可以继续到 V2EX 上打开本讨论主题的完整版本。
V2EX 是创意工作者们的社区,是一个分享自己正在做的有趣事物、交流想法,可以遇见新朋友甚至新机会的地方。
V2EX is a community of developers, designers and creative people.