Java泛型类型EMPTY vs null

时间:2017-06-22 16:18:43

标签: java generics

我将数据存储在泛型类型<E>的数组中,并且需要将该数组中的某些单元格标记为空。我不能使用null,因为null是一个有效的条目,需要与空单元格区分开来 做出这种区分的最佳方法是什么?我想避免使用其他数据结构,例如包含"empty"单元格索引的列表。

对于Object数组,我只需创建一个虚拟实例:

Object EMPTY = new Object();  

然后使用以下标记空单元格:

array[emptyIndex] = EMPTY;

据我所知,我不能创建一个泛型类型E 的实例来用作"EMPTY"标记。是否有另一种创建空标记的方法,还是有其他替代解决方案?

3 个答案:

答案 0 :(得分:2)

  

据我所知,我无法创建泛型类型E 的实例作为"EMPTY"标记。

假设您没有关于E的信息,例如较低类型的绑定或其Class对象,那么您是正确的。您无法创建实例。您可以要求用户为此目的提供一个,但这似乎既不方便又有潜在危险。

  

是否有另一种创建空标记的方法,还是有其他替代解决方案?

如果数组 List实际上必须 n数组 List,并且必须有对于您没有特定知识的通用元素类型E,如果您不能使用null值来表示空位置,那么您已将自己指定为一个角落。有些东西必须给予。

一些可能性包括

  • 使用带有Map键的Integer代替 n数组 List,并将空元素建模为完全未映射。然后,您可以使用Map.contains()来确定给定索引是否对应于空元素。

  • 使用List,其元素属于某种包装类型,其中包含EisEmpty标记或类似内容。

  • 使用没有标记的List包装器对象;将空元素表示为null,将非空null元素表示为包含包含 null

  • 放弃类型安全并强制将Object作为“空”对象放入数组 List中。只要E没有上限类型,那么在运行时应该没问题。

答案 1 :(得分:0)

在java中没有空标记。 通常,override val supervisorStrategy = OneForOneStrategy(maxNrOfRetries = 10, withinTimeRange = 1 minute) { case t: Throwable => val problemActor = sender monitorActor ! ErrorMessage(t, problemActor) Stop } 用于表示空。

因为这对你不起作用, 你需要创建自己的空标记。

你提到的技术很好。

另一种技术是定义一个像这样的Cell类:

null

答案 2 :(得分:0)

使用其他答案中描述的包装器是最佳解决方案。

如果你想使用EMPTY标记并且绝对不想使用包装器或其他/其他数据结构,那么你将不得不采用一些肮脏的技巧。
可以执行以下操作,但我不推荐它。

让用户在数据结构的构造函数中传递泛型类型的class。通过这样做,您可以获得EMPTY实例所需的类型。您不能简单地使用反射创建实例,因为您不知道实例化该类是否具有任何网站效果。要解决此问题,您可以使用像objenesis这样的库,它绕过任何构造函数,并允许您实例化没有副作用的对象。