Java泛型类型空与空
我将数据存储在泛型类型<E>
的数组中,需要将该数组中的某些单元格标记为空。我不能使用null
,因为null是需要与空单元格区分的有效条目
做出这种区分的最佳方式是什么?我希望避免使用其他数据结构,例如包含"empty"
单元格索引的列表
对于Object
数组,我只需创建一个虚拟实例:
Object EMPTY = new Object();
然后使用以下方法标记空单元格:
array[emptyIndex] = EMPTY;
据我所知,我无法创建一个泛型类型E的实例来用作"EMPTY"
标记。是否有其他方法创建空标记,或者是否有其他解决方案
# 1 楼答案
使用另一个答案中描述的包装器是最好的解决方案
如果你想使用
EMPTY
标记,但绝对不想使用包装器或其他/额外的数据结构,那么你必须采取一些肮脏的手段你可以做以下事情,但我不推荐
让用户在数据结构的构造函数中传递泛型类型的
class
。通过这样做,您可以获得EMPTY
实例所需的类型。但是,您不能简单地使用反射创建实例,因为您不知道实例化该类是否有任何站点效果。为了解决这个问题,您可以使用objenesis这样的库,它绕过任何构造函数,允许您实例化对象,而不会产生副作用# 2 楼答案
在java中没有空标记。 通常,
null
用于表示空既然这对你不管用, 您需要创建自己的空标记
你提到的技术很好
另一种方法是定义一个单元类,如下所示:
# 3 楼答案
假设您没有关于
E
的信息,例如一个较低的类型界限或它的Class
对象,那么您是正确的。无法创建实例。您可以要求用户为此提供一个,但这似乎既不方便,也有潜在的危险如果
数组List
实际上必须是an数组List
,如果它必须具有泛型元素类型E
,而您对其没有具体的了解,如果您不能使用null
值来表示空位置,那么您已经将自己指定到了一个角落。必须有所付出一些可能性包括
使用带有},并将空元素建模为完全未映射。然后可以使用
Integer
键的Map
而不是n数组{Map.contains()
来确定给定的索引是否对应于空元素使用
List
,其元素属于包含E
和isEmpty
标志或类似标志的某种包装类型使用
List
个没有标志的包装器对象;将空元素表示为null
,将非空null
元素表示为包含null
的包装放弃类型安全性,将一个普通的
Object
作为“空”对象强制放入数组List
。只要E
没有类型上限,在运行时就可以了