Java通用类型不匹配错误

Hug*_*son 5 java generics lambda java-8

我有一个带有构造函数签名的类,如下所示:

public class MyClass <U>{
    public <T> MyClass(Set<T> data, Function<T,U> func)...
}
Run Code Online (Sandbox Code Playgroud)

没关系.但是我想重载构造函数,如果你不提供Function func,它就会使用(item)->{return item;}.我写了另一个看起来像这样的构造函数:

public <T> MyClass(Set<T> data){
    this(
      data,
      (item)->{return item;}
    );
}
Run Code Online (Sandbox Code Playgroud)

这导致了类型不匹配错误,因为我作为参数提供给我的构造函数的函数接受一个类型的值T,并返回相同的值,该值应为a U.我不明白为什么代数类型系统没有看到在这种情况下U和T是相同的,那没关系?

muu*_*ued 7

系统必须假设T和U是两种不同的类型,因为你给它们两个不同的名字.但是您可以从第二个ctor中删除其他泛型类型:

public class MyClass <U>{
    public <T> MyClass(Set<T> data, Function<T,U> func) {...}
    public MyClass(Set<U> data){
        this(
          data,
          (item)->{return item;}
        );
    }
}
Run Code Online (Sandbox Code Playgroud)