无法将通用项实例化为列表Java

时间:2018-05-02 11:13:38

标签: java generics arraylist

我有一个类似于这个

的泛型类
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是否是构造函数中的任何类型的List。如果T是List&lt;&gt;然后我想将它实例化为一个新的List&lt;&gt;();

我尝试了以下代码

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

或者

this.items = new ArrayList<>();

但我一直收到错误,因为我无法提供参数类型。 如果泛型类型T是List?

,如何确保使用新List实例化项目

3 个答案:

答案 0 :(得分:1)

为类提供类型为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();

答案 1 :(得分:0)

你可以添加一个类型转换,然后它应该像你已经说过的那样工作:

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

答案 2 :(得分:0)

根据此处的评论和您的原始帖子,无论您的情况如何,items似乎都是一个集合。你不是更适合做以下事情吗?

  public class NetworkItems<T> {

    private Status status;
    private List<T> items;

    //continue the remainder of your implementation here 
  }

我理解这对于可以存在1个项目的场景并不理想,但是你确保这里的类型安全,并且通过使items成为集合,遵守这个概念可以是一个或多个项目。 p>