zoukankan      html  css  js  c++  java
  • List的toArray方法

    强制类型转换的前提是多态

    上面这句话很重要

    一般我们list转数组 都会使用

    public <T> T[] toArray(T[] a) {
            if (a.length < size)
                // Make a new array of a's runtime type, but my contents:
                return (T[]) Arrays.copyOf(elementData, size, a.getClass());
            System.arraycopy(elementData, 0, a, 0, size);
            if (a.length > size)
                a[size] = null;
            return a;
        }
    

    而不是

    public Object[] toArray() {
            return Arrays.copyOf(elementData, size);
        }
    

    第二种使用会报错如下

    Exception in thread "main" java.lang.ClassCastException: [Ljava.lang.Object; cannot be cast to [Ljava.lang.String;
    	at test_2019_11.ToArrayTest.main(ToArrayTest.java:9)
    
    

    如果面试官问你你需要怎么回答呢?

    因为不带参数的返回的就是一个Object[]  (里面没有多态)
    而带参数的是返回传入参数的类型的数组
    

    解释

    因为不带参数的返回的就是一个Object[] (里面没有多态)

    可能会有一种情况 Object[] obj = new String[size];
    即使你返回了Object[]  我也可以强转为String[]
    所有我说里面没有多态 即 new Object[newLength]
    

    源码分析

    public Object[] toArray() {
            return Arrays.copyOf(elementData, size);
        }
        
        
     @SuppressWarnings("unchecked")
    public static <T> T[] copyOf(T[] original, int newLength) {
            return (T[]) copyOf(original, newLength, original.getClass());
        }
    
    
    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;
        }
    

    T[] copy = ((Object)newType == (Object)Object[].class)
    ? (T[]) new Object[newLength]
    : (T[]) Array.newInstance(newType.getComponentType(), newLength);

    public class ToArrayTest {
    	public static void main(String[] args) {
    //		Object[] ob = {"a","b","c"};
    //		String[] str = (String[])ob;
    //		System.out.println(str);
    
    		//		Object obj = "a";
    //		String str = (String)obj;
    //		System.out.println(str);
    		
    //		System.out.println((Object)String.class);
    //		System.out.println((Object)Object[].class);
    		
    		ArrayList list = new ArrayList();
    		list.add("a");
    		list.add("b");
    		list.add("c");
    		list.elementData;
    	}
    }
    
  • 相关阅读:
    Node.js EventEmitter
    Node.js 事件循环
    Node.js 回调函数(阻塞与非阻塞)
    Node.js REPL(交互式解释器)
    NPM使用介绍
    H5表单验证特性(杂七杂八知识点)
    HTML5存储之indexedDB
    本地存储localStorage和sessionStorage
    高德地图API实例--移动端婚礼请帖
    高德地图API之DOM事件+自定义事件
  • 原文地址:https://www.cnblogs.com/sm1128/p/11956653.html
Copyright © 2011-2022 走看看