2016-12-16 44 views
4
public class VarargsParamVsLocalVariable { 

    static void f(List<String>... stringLists) { 
     // compiles fine! No problems in Runtime as well. 
     Object[] array = stringLists; 
    } 

    //but the same fails if List<String> is not a vararg parameter 
    public static void main(String[] args) { 
     List<String> stringLists; 
     List<String> stringLists1 = new ArrayList<>(); 
     //below lines give: "cannot convert from List<String> to Object[]" 
     Object[] array = stringLists; // compile error! 
     Object[] array1 = stringLists1; // compile error! 
    } 
} 

// Why I can assign List<String> variable to Object[] variable if List<String> variable is a vararg parameter? 

如果List變量是可變參數參數,爲什麼我可以將List變量賦值給Object []變量?爲什麼要編譯「List <String> lst; Object [] o = lst;」如果列表<String>是可變參數?

+0

這是因爲'stringLists'是類型的'列表 []'的可變參數。 – marstran

+0

http://stackoverflow.com/questions/35455230/an-array-of-strings-vs-string-varargs的副本? –

回答

1

任何引用類型varargs參數都可以分配給Object數組。在你的情況下,Object陣列的每個元素將是List<String>。如果你雖然改變了數組類型

您的代碼將更加清晰(和類型安全):

static void f(List<String>... stringLists) { 
    List<String>[] array = stringLists; 
} 

這表明,你是不是轉換List到一個數組。您只需指定零個,一個或多個List s到List s的陣列。

4

由於可變參數List<String>... stringLists是某種相當於陣列List<String>[] stringLists

爲了讓你的代碼編譯,你應該建立一個array爲未來:

Object[] array1 = {stringLists1}; 

對於stringLists,你需要先初始化它,否則,即使你嘗試創建一個數組作爲它上面將無法編譯。

出於同樣的原因public static void main(String[] args) {可以改寫:

public static void main(String... args) { 
3

因爲Java最初沒有具有可變參數。它們添加的方式是將該可變參數參數視爲數組。

實際上,這

static void f(List<String>... stringLists) 

...相同

static void f(List<String>[] stringLists) 

...等等它的分配兼容Object[]

+0

There * has * to be dupetarget for this question ... –

+0

This is a external dupe:https://kodejava.org/how-do-i-convert-varargs-to-an-array/:D。也許這一點:http://stackoverflow.com/questions/1656901/varargs-and-the-argument – Tom

-1

可變參數的創建方式是將任意數量的值傳遞給方法。以前它是通過在數組中使用數組來實現的。

所以Varargs只是實現它的另一種選擇,它只是隱藏了進程,開發人員不需要創建明確的數組對象。

所以你List<String> ...可變參數其實是List<String>[],不像泛型,陣列支持這一切: -

Parent[] par = new child[]; 
    Object[] objArray = new xyz[]; 

在您的情況: - 對象[] 0 = LST = List<String>[] = List<String> ...

對於更多詳情javadocs

+0

任何可以讓我知道downvote的原因? – Panther

0

在此編碼中:

static void f(List<String>... stringLists) { 
    // compiles fine! No problems in Runtime as well. 
    Object[] array = stringLists; 
} 

stringLists是一個數組List<String>List<String>[]),但此數組的每個列表基本上都是一個Object。

所以你必須知道這個,List<String>可以投到一個對象。列表數組(List [])可以轉換爲Object。任何數組,列表,哈希表...都可以轉換爲對象,這就是爲什麼它沒有問題。

0

可變參數基本上是一個數組的語法糖即編譯器將實際創建並初始化可變參數類型的數組(傳遞)。

因此,在你可變參數f方法,stringLists是這實際上是一個數組(List<String>[])和可被分配給Object[]

相關問題