Arrays 中的 copyOf 方法

2018-08-04 09:02:30 +08:00
 sharkv

想问下 jdk 的 Arrays 工具类的 copyof 方法,不能保证把 original 的元素“扔到”新数组中去啊。 为什么不限定 T 和 U 的关系呢?比如 public static <T,U extends T> T[] copyOf(U[] original, int newLength, Class<T[]> newType)。

public static <T,U> T[] copyOf(U[] original, int newLength, Class<? extends T[]> newType) {
        @SuppressWarnings("unchecked")
        T[] copy = ((Object)newType == (Object)Object[].class)
            ? (T[]) new Object[newLength]
            : (T[]) Array.newInstance(newType.getComponentType(), newLength);
        System.arraycopy(original, 0, copy, 0,
                         Math.min(original.length, newLength));
        return copy;
}
想听听大佬们的看法。
2417 次点击
所在节点    Java
6 条回复
zhaohui318
2018-08-04 10:31:20 +08:00
取舍不同吧
你把 T 和 U 绑定上关系,就失去很多灵活性
sharkv
2018-08-04 10:45:49 +08:00
@zhaohui318 看起来是这个样子,但是数组类型没有亲属关系啊,不知道有什么灵活性
zhaohui318
2018-08-04 10:55:43 +08:00
@sharkv #2
像 spring 用到了很多 反射 和 动态加载,如果把 T 和 U 绑上关系,运行时的类型检查放到了编译期,那这个方法就用不了了
zjp
2018-08-04 10:57:29 +08:00
Object[] objects = new Object[]{"1", "2"};
String[] copyArray = Arrays.copyOf(objects, 2, String[].class);
String[] castArray = (String[]) objects; // ClassCastException

因为哪怕明确知道数组的组件类型可以安全的向下转型也不能对数组转型。如一楼所说,灵活性和静态检查之间的取舍
verrickt
2018-08-04 11:00:12 +08:00
不知道 Java 里 primitive type 能不能有数组。如果可以的话,那加了泛型限制后就没法从 byte[]拷贝到 int[]了吧。不是做 Java 的,无条件猜测下。
sharkv
2018-08-04 11:17:08 +08:00
@zjp 这位老哥说的有道理!

这是一个专为移动设备优化的页面(即为了让你能够在 Google 搜索结果里秒开这个页面),如果你希望参与 V2EX 社区的讨论,你可以继续到 V2EX 上打开本讨论主题的完整版本。

https://www.v2ex.com/t/476772

V2EX 是创意工作者们的社区,是一个分享自己正在做的有趣事物、交流想法,可以遇见新朋友甚至新机会的地方。

V2EX is a community of developers, designers and creative people.

© 2021 V2EX