我有一个类似于这个
的泛型类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实例化项目答案 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>