[#0x001B] Arrays.asList()

  Arrays和Collections包含的都是static方法,可以將其視爲工具類。Arrays.asList()這個方法有點特殊,這裏記錄一下。

  首先,Arrays.asList()返回的是一個List (List是一個接口,返回List實際是返回List接口的一個實現),這個List在底層是有數組實現的,所以size是fixed的。所以,下面的代碼是不可以的:

List<Integer> list = Arrays.asList(1, 2, 3);
list.add(4); //error

 

  其次,如果不指定返回List的類型(即<>部分)的話,Arrays.asList()對其返回List的類型有自己的判斷,可以視爲它自身的一種優化機制,如下所示:

// Arrays.asList() makes its best guess about type.

import java.util.*;

class Snow {}

class Powder extends Snow {}
class Crusty extends Snow {}
class Slush extends Snow {}

class Light extends Powder {}
class Heavy extends Powder {}

public class AsListInference 
{
	public static void main(String[] args) 
	{
		List<Snow> snow1 = Arrays.asList(new Crusty(), new Slush(), new Powder()); //pass

		//List<Snow> snow2 = Arrays.asList(new Light(), new Heavy()); //error
		List<Powder> snow2 = Arrays.asList(new Light(), new Heavy()); //pass
		
		List<Snow> snow3 = Arrays.asList(new Light(), new Crusty()); //pass

		List<Snow> snow4 = new ArrayList<Snow>();
		Collections.addAll(snow4, new Light(), new Heavy()); //pass

		List<Snow> snow5 = Arrays.<Snow>asList(new Light(), new Heavy()); //pass
	}
}

  snow1添加3個Snow的導出類對象,沒有問題。

  snow2添加2個Snow的導出類對象,按理也是可以的,不過由於它們都是Powder,所以Arrays.asList()返回的是一個List<Powder>。可見Arrays.asList()返回的是精確類型的list。

  snow3混合添加,也沒有問題。

  snow4不用Arrays.asList(),使用Collections.addAll(),就沒有snow2中的侷限了。

  如果一定要Arrays.asList(new Light(), new Heavy())返回List<Snow>而不是List<Powder>,可以用Arrays.<Snow>asList()來強制產生List<Snow>,如snow5。

發佈了49 篇原創文章 · 獲贊 2 · 訪問量 1594
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章