【问题标题】:Java Generic Types Mismatch ErrorJava 泛型类型不匹配错误
【发布时间】:2015-07-02 14:09:55
【问题描述】:

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

public class MyClass <U>{
    public <T> MyClass(Set<T> data, Function<T,U> func)...
}

没关系。但是我想重载构造函数,如果你不提供函数func,它只会使用(item)-&gt;{return item;}。我编写了另一个构造函数,如下所示:

public <T> MyClass(Set<T> data){
    this(
      data,
      (item)->{return item;}
    );
}

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

【问题讨论】:

  • 你不需要像(item)-&gt;{return item;}这样笨拙的语法,只需写item -&gt; item。或者,好吧,Function.identity()...
  • 谢谢@Holger,我改用Function.identity()

标签: java generics lambda java-8


【解决方案1】:

系统必须假设 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;}
        );
    }
}

【讨论】:

  • 啊,是的,我是个白痴。哎呀。我假设类型不匹配在 U 和 T 之间,但没有意识到我实际上在不同的范围内创建了两个不同的 T。整理得很完美,非常感谢! :)
【解决方案2】:

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

Set<Integer> ints = new HashSet<>();
MyClass<String> myobj = new <Integer> MyClass (ints);

您的第一个构造函数需要Set&lt;Integer&gt;Function&lt;Integer,String&gt; 参数,但您的第二个构造函数会尝试将Function&lt;Integer,Integer&gt; 传递给它。这就是你的代码没有通过编译的原因。

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

【讨论】:

    【解决方案3】:

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

    public MyClass(Set<U> data){
        this(
          data,
          (item)->{return item;}
        );
    }
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2020-10-18
      相关资源
      最近更新 更多