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

Method unmodifiablelist() cannot be applied to given type

我正在尝试编译前同事的代码,但它说方法 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();
   }
}

这是我编译应用程序后 eclipse 打印的错误 log/information:

[INFO] BUILD FAILURE

[ERROR] Failed to execute goal org.apache.maven.plugins:maven-compiler-      plugin:3.6.1:compile (default-compile) on project 
         AutomationTesting: Compilation failure: Compilation failure: 
[ERROR] /C:/Users/Newbie/eclipse-   workspace/automationTesting/Data.java:[42,35] method unmodifiableList in    class java.util.
          Collections cannot be applied to given types;
[ERROR]   required: java.util.List<? extends T>
[ERROR]   found: java.util.Collection<framework.data.people.NonReference>
[ERROR]   reason: inferred type does not conform to upper bound(s)
[ERROR]     inferred: java.lang.Object&java.util.List<? extends   java.lang.Object>&java.util.Collection<framework.data.people.NonReference>
[ERROR]     upper bound(s):   java.util.Collection<framework.data.people.NonReference>,java.util.List<?  extends java.lang.Object>,java.lang.
              ObjectCompilation failure: Compilation failure: 
[ERROR] /C:/Users/Newbie/eclipse-workspace/automationTesting/Data.java:  
[42,35] method unmodifiableList in class java.util.Collections 
        cannot be applied to given types;
[ERROR]   required: java.util.List<? extends T>
[ERROR]   found:    java.util.Collection<framework.data.people.NonReference>
[ERROR]   reason: inferred type does not conform to upper bound(s)
[ERROR]     inferred: java.lang.Object&java.util.List<? extends   java.lang.Object>&java.util.Collection<framework.data.people.NonReference>
[ERROR]     upper bound(s):  java.util.Collection<framework.data.people.NonReference>,java.util.List<? extends java.lang.Object>,java.lang.Object

您需要显式声明泛型类型参数。由于某些原因*,无法推断。

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()) 应该 return 拿什么。

上述四个片段中的任何一个都可以帮助您解决问题。


x -> (NonReference) x可以换成NonReference.class::cast.