我将数据存储在泛型类型<E>
的数组中,并且需要将该数组中的某些单元格标记为空。我不能使用null
,因为null是一个有效的条目,需要与空单元格区分开来
做出这种区分的最佳方法是什么?我想避免使用其他数据结构,例如包含"empty"
单元格索引的列表。
对于Object
数组,我只需创建一个虚拟实例:
Object EMPTY = new Object();
然后使用以下标记空单元格:
array[emptyIndex] = EMPTY;
据我所知,我不能创建一个泛型类型E 的实例来用作"EMPTY"
标记。是否有另一种创建空标记的方法,还是有其他替代解决方案?
答案 0 :(得分:2)
据我所知,我无法创建泛型类型E 的实例作为
"EMPTY"
标记。
假设您没有关于E
的信息,例如较低类型的绑定或其Class
对象,那么您是正确的。您无法创建实例。您可以要求用户为此目的提供一个,但这似乎既不方便又有潜在危险。
是否有另一种创建空标记的方法,还是有其他替代解决方案?
如果数组 List
实际上必须 n数组 List
,并且必须有对于您没有特定知识的通用元素类型E
,如果您不能使用null
值来表示空位置,那么您已将自己指定为一个角落。有些东西必须给予。
一些可能性包括
使用带有Map
键的Integer
代替 n数组 List
,并将空元素建模为完全未映射。然后,您可以使用Map.contains()
来确定给定索引是否对应于空元素。
使用List
,其元素属于某种包装类型,其中包含E
和isEmpty
标记或类似内容。
使用没有标记的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这样的库,它绕过任何构造函数,并允许您实例化没有副作用的对象。