V2EX = way to explore
V2EX 是一个关于分享和探索的地方
现在注册
已注册用户请  登录
sharkv
V2EX  ›  Java

Arrays 中的 copyOf 方法

  •  
  •   sharkv · 2018-08-04 09:02:30 +08:00 · 2216 次点击
    这是一个创建于 2063 天前的主题,其中的信息可能已经有所发展或是发生改变。

    想问下 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;
    }
    
    想听听大佬们的看法。
    
    6 条回复    2018-08-04 11:17:08 +08:00
    zhaohui318
        1
    zhaohui318  
       2018-08-04 10:31:20 +08:00
    取舍不同吧
    你把 T 和 U 绑定上关系,就失去很多灵活性
    sharkv
        2
    sharkv  
    OP
       2018-08-04 10:45:49 +08:00
    @zhaohui318 看起来是这个样子,但是数组类型没有亲属关系啊,不知道有什么灵活性
    zhaohui318
        3
    zhaohui318  
       2018-08-04 10:55:43 +08:00
    @sharkv #2
    像 spring 用到了很多 反射 和 动态加载,如果把 T 和 U 绑上关系,运行时的类型检查放到了编译期,那这个方法就用不了了
    zjp
        4
    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
        5
    verrickt  
       2018-08-04 11:00:12 +08:00 via Android
    不知道 Java 里 primitive type 能不能有数组。如果可以的话,那加了泛型限制后就没法从 byte[]拷贝到 int[]了吧。不是做 Java 的,无条件猜测下。
    sharkv
        6
    sharkv  
    OP
       2018-08-04 11:17:08 +08:00
    @zjp 这位老哥说的有道理!
    关于   ·   帮助文档   ·   博客   ·   API   ·   FAQ   ·   我们的愿景   ·   实用小工具   ·   1411 人在线   最高记录 6543   ·     Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 · 24ms · UTC 17:34 · PVG 01:34 · LAX 10:34 · JFK 13:34
    Developed with CodeLauncher
    ♥ Do have faith in what you're doing.