casting Arrays.asList causing exception: java.util.Arrays$ArrayList cannot be cast to java.util.ArrayList

后端 未结 7 1884
忘了有多久
忘了有多久 2020-11-29 08:17

I\'m new to Java and am trying to understand why the first code snippet doesn\'t cause this exception but the second one does. Since a string array is passed into Arrays.as

相关标签:
7条回答
  • 2020-11-29 08:23

    The problem is you specified your List to contain ArrayLists - and by implication no other List implementations. Arrays.asList() returns its own implementation of a List based on the implementation of the array parameter, which may not be an ArrayList. That's your problem.

    More broadly, you have a classic code style problem: You should be referring to abstract interfaces (ie List), not concrete implementations (ie ArrayList). Here's how your code should look:

    List<List<String>> stuff = new ArrayList<List<String>>();
    String[] titles = { "ticker", "grade", "score" };
    stuff.add((List<String>) Arrays.asList(titles));
    

    I have tested this code, and it runs without error.

    0 讨论(0)
  • 2020-11-29 08:23

    No need to cast manually. This simple code may help you,

    List stuff = new ArrayList();
    String line = "a,b,cdef,g";
    String delim = ",";
    stuff.addAll(Arrays.asList(line.split(delim)));
    
    0 讨论(0)
  • 2020-11-29 08:32

    If you do this, you won't get any CCE:

    ArrayList<ArrayList<String>> stuff = new ArrayList<ArrayList<String>>();
    String[] titles = {"ticker", "grade", "score"};
    stuff.add(new ArrayList<String>(Arrays.asList(titles)));
    

    As the error clearly states, the class java.util.ArrayList isn't the same as nested static class java.util.Arrays.ArrayList. Hence the exception. We overcome this by wrapping the returned list using a java.util.ArrayList.

    0 讨论(0)
  • 2020-11-29 08:36

    For me (using Java 1.6.0_26), the first snippet gives the same exception as the second one. The reason is that the Arrays.asList(..) method does only return a List, not necessarily an ArrayList. Because you don't really know what kind (or implementation of) of List that method returns, your cast to ArrayList<String> is not safe. The result is that it may or may not work as expected. From a coding style perspective, a good fix for this would be to change your stuff declaration to:

    List<List<String>> stuff = new ArrayList<List<String>>();
    

    which will allow to add whatever comes out of the Arrays.asList(..) method.

    0 讨论(0)
  • 2020-11-29 08:37

    If you want to use your property as ArrayList<'T'> you need only declare there and create a getter.

        private static ArrayList<String> bandsArrayList;
    
        public ArrayList<String> getBandsArrayList() {
            if (bandsArrayList == null) {
                bandsArrayList = new ArrayList<>();
    
                String[] bands = {"Metallica", "Iron Maiden", "Nirvana"};
                bandsArrayList.addAll(Arrays.asList(bands));
            }
            return bandsArrayList;
        }
    

    Initializes the variable and use the method [addAll (Collection collection)](http://developer.android.com/intl/pt-br/reference/java/util/ArrayList.html#addAll(java.util.Collection))

    0 讨论(0)
  • 2020-11-29 08:39

    First, Arrays.asList() should be never casted to ArrayList. Second, since generics were introduced into java programming language casting is still relevant when using legacy, pre-generics APIs.

    Third, never use concrete classes at the left of assignment operator.

    Bottom line, say

    List<List<String>> stuff = new ArrayList<List<String>>();
    String line = "a,b,cdef,g";
    String delim = ",";
    String[] pieces = line.split(delim);
    stuff.add(Arrays.asList(pieces));
    
    
    
    List<List<String>> stuff = new ArrayList<List<String>>();
    String[] titles = {"ticker", "grade", "score"};
    stuff.add(Arrays.asList(titles));
    

    and be happy.

    0 讨论(0)
提交回复
热议问题