我有一个具有构造函数签名的类,如下所示:
public class MyClass <U>{
public <T> MyClass(Set<T> data, Function<T,U> func)...
}这很好。但是我想重载构造函数,因为如果您不提供函数func,它将只使用(item)->{return item;}。我编写了另一个构造函数,如下所示:
public <T> MyClass(Set<T> data){
this(
data,
(item)->{return item;}
);
}这会导致类型错配错误,因为我作为参数提供给构造函数的函数接受T类型的值,并返回相同的值,应该是U。我不明白为什么代数型系统看不到,在这种情况下,U和T是相同的,这没关系?
发布于 2015-07-02 14:15:06
系统必须假定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;}
);
}
}发布于 2015-07-02 14:21:21
让我们尝试使用第二个构造函数创建类的实例:
Set<Integer> ints = new HashSet<>();
MyClass<String> myobj = new <Integer> MyClass (ints);第一个构造函数需要一个Set<Integer>和一个Function<Integer,String>参数,但是第二个构造函数将尝试将一个Function<Integer,Integer>传递给它。这就是为什么您的代码没有通过编译。
定义泛型类和方法时,它们必须对可以替换其类型参数的任何类型组合有效。
发布于 2015-07-02 14:22:25
由于您声明了T和U两种不同的类型,编译器合理地认为它们是不同的。如果它们是相同的,则不要声明T,只使用U:
public MyClass(Set<U> data){
this(
data,
(item)->{return item;}
);
}https://stackoverflow.com/questions/31186885
复制相似问题