首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >Java泛型类型不匹配错误

Java泛型类型不匹配错误
EN

Stack Overflow用户
提问于 2015-07-02 14:09:55
回答 3查看 282关注 0票数 5

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

代码语言:javascript
运行
复制
public class MyClass <U>{
    public <T> MyClass(Set<T> data, Function<T,U> func)...
}

这很好。但是我想重载构造函数,因为如果您不提供函数func,它将只使用(item)->{return item;}。我编写了另一个构造函数,如下所示:

代码语言:javascript
运行
复制
public <T> MyClass(Set<T> data){
    this(
      data,
      (item)->{return item;}
    );
}

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

EN

回答 3

Stack Overflow用户

回答已采纳

发布于 2015-07-02 14:15:06

系统必须假定T和U是两种不同的类型,因为您给它们取了两个不同的名称。但是,您可以从第二个ctor中删除额外的泛型类型,如下所示:

代码语言:javascript
运行
复制
public class MyClass <U>{
    public <T> MyClass(Set<T> data, Function<T,U> func) {...}
    public MyClass(Set<U> data){
        this(
          data,
          (item)->{return item;}
        );
    }
}
票数 7
EN

Stack Overflow用户

发布于 2015-07-02 14:21:21

让我们尝试使用第二个构造函数创建类的实例:

代码语言:javascript
运行
复制
Set<Integer> ints = new HashSet<>();
MyClass<String> myobj = new <Integer> MyClass (ints);

第一个构造函数需要一个Set<Integer>和一个Function<Integer,String>参数,但是第二个构造函数将尝试将一个Function<Integer,Integer>传递给它。这就是为什么您的代码没有通过编译。

定义泛型类和方法时,它们必须对可以替换其类型参数的任何类型组合有效。

票数 3
EN

Stack Overflow用户

发布于 2015-07-02 14:22:25

由于您声明了T和U两种不同的类型,编译器合理地认为它们是不同的。如果它们是相同的,则不要声明T,只使用U:

代码语言:javascript
运行
复制
public MyClass(Set<U> data){
    this(
      data,
      (item)->{return item;}
    );
}
票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/31186885

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档