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 []变量?
答案 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