为了账号安全,请及时绑定邮箱和手机立即绑定

方法 unmodifiablelist() 不能应用于给定类型

方法 unmodifiablelist() 不能应用于给定类型

阿波罗的战车 2023-05-10 14:14:59
我正在尝试编译一位前同事的代码,但它说该方法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.


查看完整回答
反对 回复 2023-05-10
  • 1 回答
  • 0 关注
  • 114 浏览

添加回答

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信