有 Java 编程相关的问题?

你可以在下面搜索框中键入要查询的问题!

Java泛型类型空与空

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

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

Object EMPTY = new Object();  

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

array[emptyIndex] = EMPTY;

据我所知,我无法创建一个泛型类型E的实例来用作"EMPTY"标记。是否有其他方法创建空标记,或者是否有其他解决方案


共 (3) 个答案

  1. # 1 楼答案

    使用另一个答案中描述的包装器是最好的解决方案

    如果你想使用EMPTY标记,但绝对不想使用包装器或其他/额外的数据结构,那么你必须采取一些肮脏的手段
    你可以做以下事情,但我不推荐

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

  2. # 2 楼答案

    在java中没有空标记。 通常,null用于表示空

    既然这对你不管用, 您需要创建自己的空标记

    你提到的技术很好

    另一种方法是定义一个单元类,如下所示:

    public class Cell
    {
        private boolean empty;
        private Object data;
    
        public boolean isEmpty()
        {
            return empty;
        }
    
        public void setEmpty()
        {
            empty = true;
        }
    
        public void setNotEmpty()
        {
            empty = false;
        }
    
        // set and get data.
    }
    
  3. # 3 楼答案

    As far as I know I cannot create an instance of generic type E to be used as an "EMPTY" marker though.

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

    Is there another way of creating an empty marker or are there any alternative solutions?

    如果数组List实际上必须an数组List,如果它必须具有泛型元素类型E,而您对其没有具体的了解,如果您不能使用null值来表示空位置,那么您已经将自己指定到了一个角落。必须有所付出

    一些可能性包括

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

    • 使用List,其元素属于包含EisEmpty标志或类似标志的某种包装类型

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

    • 放弃类型安全性,将一个普通的Object作为“空”对象强制放入数组List。只要E没有类型上限,在运行时就可以了