我正在尝试编译一位前同事的代码,但它说该方法unmodifiableList()不能应用于给定类型。Eclipse 中的代码没有显示任何错误。但它仍然不让我编译它。可能是什么错误?package framework.interview.demographics;import java.util.ArrayList;import java.util.Collections;import java.util.List;import java.util.Objects;import java.util.stream.Collectors;import java.util.stream.Stream;import org.apache.xmlbeans.impl.xb.xsdschema.Public;import framework.data.people.NonReference;import framework.data.people.people;public class schedualData { private final List<people> schedual; private schedualData(List<people> schedual) { this.schedual = Objects.requireNonNull(schedual); } public static schedualData getSchedualData(List<people> schedual) { if(schedual.size() < 1) throw new IllegalArgumentException("schedual must contain at least one people"); if(Stream.of(schedual).filter(people -> (!(people instanceof NonReference))).count() != 1) throw new IllegalArgumentException("There must be one and only one Reference between" + "People, number, and Review"); return new schedualData(schedual); } //****** Getters ******\\ public people getReference() { return schedual.stream() .filter(people -> !(people instanceof NonReference)) .toArray(people[]::new)[0]; } public List<NonReference> getNonReferenceschedual() { //This is where the error is showing. return Collections .unmodifiableList(schedual.stream() .filter(NonReference.class::isInstance) .map(x -> (NonReference) x) .collect(Collectors.toCollection (ArrayList<NonReference>::new))); } public List<people> getFullschedual() { return Collections.unmodifiableList(schedual); } public int size() { return schedual.size(); }}
1 回答
千巷猫影
TA贡献1829条经验 获得超7个赞
您需要显式声明泛型类型参数。由于某种原因*,无法推断。
return Collections.<NonReference>unmodifiableList(schedual.stream() .filter(NonReference.class::isInstance) .map(NonReference.class::cast) .collect(Collectors.toCollection(ArrayList::new)));
或者
return Collections.unmodifiableList(schedual.stream() .filter(NonReference.class::isInstance) .map(NonReference.class::cast) .collect(Collectors.<NonReference, List<NonReference>>toCollection(ArrayList::new)));
或者
ArrayList<NonReference> result = schedual.stream() .filter(NonReference.class::isInstance) .map(NonReference.class::cast) .collect(Collectors.toCollection(ArrayList::new)); return Collections.unmodifiableList(result);
虽然,你可以简单地去
return Collections.unmodifiableList(schedual.stream() .filter(NonReference.class::isInstance) .map(NonReference.class::cast) .collect(Collectors.toList()));
*问题在于,它Collections.unmodifiableList
决定了 的类型collect(Collectors.toCollection())
,而不是相反,正如您可能期望的那样。
您可以通过准确说明您想要的内容来帮助编译器进行类型推断。你说要么unmodifiableList
拿走什么,.collect(Collectors.toCollection())
要么返回什么。
上面提到的四个片段中的任何一个都可以帮助您解决问题。
x -> (NonReference) x
可以替换为NonReference.class::cast
.
添加回答
举报
0/150
提交
取消