列表类型不同时,列表的Java数组有效

时间:2019-07-08 17:32:35

标签: java arrays arraylist

我有以下代码在工作,我不确定为什么它不会引发异常:

List[] x=new ArrayList[2];
x[0]=new ArrayList<Integer>();
x[1]=new ArrayList<String>();
x[0].add("test");
x[1].add(5);
System.out.println(x[0]);
System.out.println(x[1]);

此打印:

[test]
[5]

x[0]是整数数组,它添加String没有任何问题。 x[1]是String数组,它添加整数没有任何问题。

这是怎么工作的?

3 个答案:

答案 0 :(得分:4)

首先,这与数组无关。以下表现出相同的行为:

List x = new ArrayList();
x = new ArrayList<Integer>();
x.add("test");
System.out.println(x);

其行为方式的关键原因是x被声明为 raw List类型。有关全面的讨论,请参见What is a raw type and why shouldn't we use it?

答案 1 :(得分:2)

您已经声明了原始类型列表的数组。编译代码后,泛型值在运行时不存在。因此,基本上,您的列表的类型为List<Object>

  • "test"String,基本上是Object
  • 5自动装箱到Integer的{​​{1}}

所以您的编译器不会抛出任何错误。如果您使用的是IDE,则可能会警告您:

  

以原始类型`java.util.List'的成员的形式对'add(E)'的未选中调用

(来自IntelliJ)

答案 2 :(得分:0)

您的数组for he in range(1, 25): he_str = str(he) ### df_all is a dataframe that contains only 3200 records ### ### df_all does contain 146 columns. Maybe this is why? ### df_all = df_all.withColumn('PROFIT_INC_HE' + he_str, functions.lit(0)) df_all = df_all.withColumn('PROFIT_DEC_HE' + he_str, functions.lit(0)) ### TIER_PRICE_FACTORS is list of 4 elements ### for tiers in TIER_PRICE_FACTORS: tiers_str = str(tiers).replace('.', '') df_all = df_all.withColumn('PROFIT_INC_HE' + he_str, functions.col('PROFIT_INC_HE' + he_str) \ + functions.col('BID_PROFIT_INC_HE' + he_str + '_' + tiers_str)) df_all = df_all.withColumn('PROFIT_DEC_HE' + he_str, functions.col('PROFIT_DEC_HE' + he_str) \ + functions.col('BID_PROFIT_Dec_HE' + he_str + '_' + tiers_str)) 被定义为原始类型x,因此类型参数被删除,最终您调用了List,在整数的情况下,它依赖于在自动装箱中。

如果您尝试将add(Object)x[0]别名为期望类型的变量,则首先会遇到编译错误:

x[1]