【发布时间】:2018-04-24 21:56:58
【问题描述】:
考虑到这些元素:
一个接口I:
public interface I {
int getType();
}
一类C:
public class C implements I {
@Override
public int getType() { return 0; }
}
给定 I 的列表,我如何使用 Java 8 制作 C 的 ArrayList?
这是我尝试过的:
public void foo(List<? extends I> listI) {
List<C> listC = new ArrayList<>((List<C>)listI.stream()
.filter(o -> o.getType() == 0)
.collect(Collectors.toList())
);
}
我收到的警告:
未经检查的演员表:
'java.util.List<capture<? extends I>>'到'java.util.List<C>'
【问题讨论】:
-
filter(o -> o instanceof C).map(o -> (C) o). -
在 equals 函数之外使用 instanceof 不是一个坏习惯吗?
-
public class C extends I-- 这不是有效的 Java,一个类不能extend一个接口。它只能implement一个接口。如果您需要帮助,您必须从 valid 可编译的 Java 代码开始。 -
@PaulLemarchand 如果你想检查某个东西是否是
C的实例,你会怎么做呢? -
如果
List<I>包含实现I但不是C或其子类之一的对象,你会怎么做?这就是为什么您最初的尝试不起作用的原因。
标签: java arraylist casting java-8 java-stream