2016-12-16 54 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[]

相关问题