gpt4 book ai didi

java - 为什么允许我将泛型数组声明为实例变量?

转载 作者:塔克拉玛干 更新时间:2023-11-03 03:50:41 25 4
gpt4 key购买 nike

我完全知道不能像这样实例化通用数组:

data = new Entry<K, V>[];

这会导致错误:

Cannot create a generic array of Entry<K,V>

那么,为什么我可以声明一个没有错误的泛型数组实例变量?

private Entry<K, V>[] data;

最佳答案

原则上,Joachim Sauer 的评论已经是您的答案,但是,我想详细说明一下。

Sun (Oracle) 知道一种称为内存污染的现象,如果通用变量指针指向类型不兼容的对象,就会发生这种现象。例如,可以使用以下代码强制执行此操作:

List<String> list = new ArrayList<String>();
List<Number> numberList = (List<Number>)(List)list;

显然,一旦您开始使用该代码,您就会开始看到 ClassCastExceptions。在设计泛型时,这对 Sun 来说完全没问题,因为您会收到强制警告 RawType/Unchecked conversion。每当发出此警告时,您就知道您的代码未经过 100% 类型检查,可能会发生内存污染。

泛型的总体设计原则是,所有可能的内存污染都由此类警告指示。这就是为什么禁止创建通用数组的原因。假设不是,可能会发生以下情况:

List<String>[] array = new List<String>[5];
Object[] oArray = array // this works without warning and has to for compatibility
List<Object> oList = new ArrayList<Object>();
oArray[1] = oList;

您将在没有任何警告的情况下在那里发生内存污染,并且出于兼容性原因,无法生成警告。这就是 Sun 决定禁止泛型数组的原因。但是,可能会声明变量,因为您会在那里收到未经检查的转换警告,而这正是 Sun 想要的:如果可能发生污染,则发出警告。

关于java - 为什么允许我将泛型数组声明为实例变量?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/9663191/

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