Java 为什么它会编译;列表<;字符串>;lst;对象[]o=lst&引用;如果列表<;字符串>;是瓦拉格斯吗? 公共类VarargsParamVsLocalVariable{ 静态无效f(列表…字符串列表){ //编译很好!运行时也没有问题。 对象[]数组=字符串列表; } //但如果List不是vararg参数,则同样会失败 公共静态void main(字符串[]args){ 列表列表; List stringLists1=新建ArrayList(); //下面几行给出:“无法从列表转换为对象[]” Object[]数组=字符串列表;//编译错误! Object[]array1=stringLists1;//编译错误! } } //如果列表变量是vararg参数,为什么我可以将列表变量分配给Object[]变量?

Java 为什么它会编译;列表<;字符串>;lst;对象[]o=lst&引用;如果列表<;字符串>;是瓦拉格斯吗? 公共类VarargsParamVsLocalVariable{ 静态无效f(列表…字符串列表){ //编译很好!运行时也没有问题。 对象[]数组=字符串列表; } //但如果List不是vararg参数,则同样会失败 公共静态void main(字符串[]args){ 列表列表; List stringLists1=新建ArrayList(); //下面几行给出:“无法从列表转换为对象[]” Object[]数组=字符串列表;//编译错误! Object[]array1=stringLists1;//编译错误! } } //如果列表变量是vararg参数,为什么我可以将列表变量分配给Object[]变量?,java,variadic-functions,Java,Variadic Functions,如果列表变量是vararg参数,为什么我可以将列表变量分配给Object[]变量 任何引用类型varargs参数都可以分配给对象数组。在您的特定情况下,对象数组的每个元素都将是一个列表 如果您更改了数组的类型,您的代码将更加清晰(并且类型安全): public class VarargsParamVsLocalVariable { static void f(List<String>... stringLists) { // compiles fine! N

如果列表变量是vararg参数,为什么我可以将列表变量分配给Object[]变量

任何引用类型varargs参数都可以分配给
对象
数组。在您的特定情况下,
对象
数组的每个元素都将是一个
列表

如果您更改了数组的类型,您的代码将更加清晰(并且类型安全):

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? 
static void f(列表…字符串列表){
List[]数组=字符串列表;
}

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

因为Varargs类似
List。。。StringList
在某种程度上等同于一个类似于
List[]StringList
数组

要使代码编译,应创建一个
数组
,如下所示:

static void f(List<String>... stringLists) {
    List<String>[] array = stringLists; 
}
对于
stringlist
,您需要首先初始化它,否则即使您尝试创建如上所述的数组,它也不会编译

出于同样的原因,
publicstaticvoidmain(String[]args){
可以被重写:

Object[] array1 = {stringLists1};

因为Java最初没有varargs,它们的添加方式是将varargs参数当作数组处理

实际上,这

public static void main(String... args) {
static void f(列表…字符串列表)
…与

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

…因此,它的赋值与
对象[]
兼容Varargs是作为将任意数量的值传递给方法的方式创建的。以前,它是通过使用数组将值放入该数组来实现的

所以Varargs只是实现同样目的的另一个选项,它只是隐藏了过程,开发人员不需要创建显式数组对象

因此,您的
List…
varargs实际上是
List[]
,与泛型不同,数组支持所有这些:-

static void f(List<String>[] stringLists)
就你而言:- 对象[]o=lst=
列表[]
=
列表…

有关此代码中的更多详细信息,请参见:

   Parent[] par = new child[];
   Object[] objArray = new xyz[];
static void f(列表…字符串列表){
//编译很好!运行时也没有问题。
对象[]数组=字符串列表;
}
StringList是一个由
List
List[]
)组成的数组,但该数组的每个列表基本上都是一个对象


所以你必须知道,
List
可以被强制转换为一个对象可以强制转换为对象。任何数组、列表、哈希表……都可以强制转换为对象,这就是它可以毫无问题地传递的原因。

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


因此,在varargs
f
方法中,
stringlist
是vararg,它实际上是一个数组(
List[]
),可以分配给
Object[]

,这是因为
stringlist
的类型是
List[]
。重复的?这是一个外部副本::D。可能有点:
static void f(List<String>... stringLists) {
    // compiles fine! No problems in Runtime as well.
    Object[] array = stringLists; 
}