[] )"和 "array of type variable( T[] )"有什么区别?-6ren"> [] )"和 "array of type variable( T[] )"有什么区别?-更新:虽然我已经得到了答案,但似乎我对问题的描述不是很清楚。所以我做了很多改变以使其他人理解我的问题。 我对不允许参数化类型数组的原因的理解: Integer[] b = {1,2,3}; Objec-6ren">
gpt4 book ai didi

java - "arrays of parameterized type( List[] )"和 "array of type variable( T[] )"有什么区别?

转载 作者:行者123 更新时间:2023-12-02 05:03:26 25 4
gpt4 key购买 nike

更新:虽然我已经得到了答案,但似乎我对问题的描述不是很清楚。所以我做了很多改变以使其他人理解我的问题。

<小时/>

我对不允许参数化类型数组的原因的理解:

Integer[] b = {1,2,3};
Object[] a = b;
String[] c = {"123"};
a[0] = c; // Exception in thread "main" java.lang.ArrayStoreException
Integer i = b[0];
// Not really allowed.
List<String>[] lsa = new List<String>[10];
Object o = lsa;
Object[] oa = (Object[]) o;
List<Integer> li = new ArrayList<Integer>();
li.add(new Integer(3));
// Unsound, but passes run time store check
oa[1] = li;

// Run-time error: ClassCastException.
String s = lsa[1].get(0);

这两段代码结构相同。

在第 1 部分中,Object[] a = b使两者ab指向同一个变量b 。所以a[0] = c实际上正在改变b 。这种操作在编译时不会引起任何警告,但会抛出 ArrayStoreException。

在第 2 部分中,Object o = lsa; Object[] oa = (Object[]) o;使两者oalsa指向同一个变量lsa ,和oa[1] = li;实际上正在改变lsa .

所以我认为这就是为什么不允许使用参数化类型数组的原因。

如果我的理解是正确的,像T[] myArray这样的情况也应该被拒绝。因为下面的代码也具有相同的结构。

import java.util.*;

public class Test {
public static <T> void test(T[] t) {
Object[] a = t;
String[] c = {"123"};
a[0] = c;
T i = t[0];
}

public static void main(String[] args) {
Integer[] t = {1,2,3};
test(t);
}
}

但是在 Java 教程中,

<T> T[] makeArray(T t) {
return new T[100]; // Error.
}

给出的原因是

Since type variables don't exist at run time, there is no way to determine what the actual array type would be.

不是我期望的原因。

它还说

The way to work around these kinds of limitations is to use class literals as run-time type tokens

所以我在 Generics gotchas 找到了一个例子。 “未走的路”部分的代码:

public class ArrayList<V> implements List<V> {
private V[] backingArray;
private Class<V> elementType;

public ArrayList(Class<V> elementType) {
this.elementType = elementType;
backingArray = (V[]) Array.newInstance(elementType, DEFAULT_LENGTH);
}
}

看来使用类文字已经解决了使用类型变量数组( T[] )的问题。但我一开始提到的结构问题仍然存在。回想一下,我认为这三段代码的结构都导致没有编译警告但运行时错误。

那么,我的理解有什么问题吗?

非常感谢您的宝贵时间:)

最佳答案

<小时/>

对于你的第一个问题

why arrays of parameterized type not allowed?

我找到the answer

Can I create an array whose component type is a concrete parameterized type?

No, because it is not type-safe.

<小时/>

那么,我试图解释为什么示例代码会抛出异常?

  1. java编译在编译时没有发现问题,每个类型转换看起来都是合法的。 (ArrayStoreException是RuntimeException)

  2. 当您将String元素放入Integer Array中时,会发生异常。您可以使用 javac 和 javap 来查看字节码。T[] t 的类型是 Object[],因此变量 a(引用类型)将引用 Integer[] 对象。当您将 String 元素放入 Integer Array

  3. 时发生异常

我认为问题与 java generic 无关,因此我按如下方式更改示例以重现异常。

public class Test {

public static void main(String[] args) {
Integer[] t = {1,2,3};
Object[] a = t;
a[2] = "aaa";
}
}

关于java - "arrays of parameterized type( List<String>[] )"和 "array of type variable( T[] )"有什么区别?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/56372096/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com