有 Java 编程相关的问题?

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

无法将泛型项实例化为Java列表

我有一个与此类似的泛型类

public class NetworkItems<T> {

    private Status status;
    private T items;

    public NetworkItems() {
        this.status = Status.FAILURE;
        this.items = null;
    }

    public NetworkItems(Status status, T listItems) {
        this.status = status;
        this.items = listItems;
    }

    public NetworkItems(Status status) {
        this.status = status;
        this.items = null;
    }

    public Status getStatus() {
        return status;
    }

    public void setStatus(Status status) {
        this.status = status;
    }

    public T getItems() {
        return items;
    }

    public void setItems(T items) {
        this.items = items;
    }
}

我要做的就是检查参数T是否是构造函数中任何类型的列表。如果T是一个列表<&燃气轮机;然后我想将其实例化为一个新列表<&燃气轮机;();

我尝试了以下代码

if (this.items instanceof List) {
    this.items = Collections.emptyList();
}

还是这个

this.items = new ArrayList<>();

但我一直收到一个错误,因为我无法给出参数类型。 如果泛型类型T是一个列表,我如何确保用一个新列表实例化这些项


共 (3) 个答案

  1. # 1 楼答案

    您可以只添加一个类型转换,然后它应该像您所说的那样工作:

    if (this.items instanceof List) {
        this.items = (T) Collections.emptyList();
    }
    
  2. # 2 楼答案

    为类提供类型为Supplier<T>的非可选构造函数参数

    public class NetworkItems<T> {
    
        private Status status;
        private T items;
        private Supplier<T> defaultCreator;
    
        public NetworkItems(Supplier<T> def) {
            this.status = Status.FAILURE;
            this.items = null;
            this.defaultCreator = def;
        }
    
        public T createDefault() {
            return defaultCreator.get();
        }
        // ...
    

    现在,如果您有一个NetworkItems的实例,您总是可以得到一个默认值。例如

    NetworkItem<List<String>> stringListItems = new NetworkItem<>(ArrayList::new);
    List<String> defItem = stringListItems.createDefault();
    
  3. # 3 楼答案

    根据这里的评论和您的原始帖子,似乎items是一个集合,不管您的情况如何。您是否更适合做以下工作

      public class NetworkItems<T> {
    
        private Status status;
        private List<T> items;
    
        //continue the remainder of your implementation here 
      }
    

    我知道这对于可以存在一个项的场景并不理想,但是您可以通过将items设置为集合来确保这里的类型安全,并坚持可以是一个或多个项的概念