为什么它编译&#34; List <string> lst;对象[] o = lst;&#34;如果List <string>是varargs?

时间:2016-12-16 08:15:00

标签: java variadic-functions

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变量是vararg参数,为什么我可以将List变量分配给Object []变量?

6 个答案:

答案 0 :(得分:4)

因为List<String>... stringLists之类的 Varargs 在某种程度上等同于List<String>[] stringLists之类的数组

要编译代码,您应该创建一个array作为下一个:

Object[] array1 = {stringLists1};

对于stringLists,您需要先将其初始化,否则即使您尝试创建一个上面的数组也不会编译。

出于同样的原因public static void main(String[] args) {可以重写:

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

答案 1 :(得分:3)

因为Java最初没有varargs。他们添加的方式是将varargs参数视为数组。

实际上,这个

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

...与

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

...所以它的作业与Object[]兼容。

答案 2 :(得分:1)

任何引用类型varargs参数都可以分配给Object数组。在您的特定情况下,Object数组的每个元素都是List<String>

如果你改变了数组的类型,你的代码会更清晰(并且类型安全):

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

这表明您没有将List转换为数组。您只需将零个,一个或多个List分配给List s。

数组

答案 3 :(得分:0)

在此代码中:

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

stringLists是List<String>List<String>[])的数组,但此数组的每个List基本上都是一个Object。

所以你必须知道这一点,List<String>可以强制转换为Object。列表数组(List [])可以强制转换为Object。任何数组,列表,哈希表......都可以强制转换为对象,这就是它没有问题的原因。

答案 4 :(得分:0)

varargs基本上是数组的语法糖,即编译器实际上会创建并初始化vararg类型的数组(传递)。

因此,在您的varargs f方法中,stringLists是vararg,实际上是一个数组(List<String>[])并且可以分配给Object[]

答案 5 :(得分:-1)

创建Varargs是将任意数量的值传递给方法的方法。以前通过在该数组中放置值来使用数组来实现它。

所以Varargs只是实现相同的另一种选择,它只是隐藏了进程,开发人员不需要创建明确的数组对象。

所以你的List<String> ... varargs实际上是List<String>[],与泛型不同,数组支持所有这些: -

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

在你的情况下: -        对象[] o = lst = List<String>[] = List<String> ...

有关详细信息javadocs