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