当前位置: 首页 > 知识库问答 >
问题:

为什么Java说这些类型不兼容?

爱炯
2023-03-14

这是我的代码:

private BiFunction<B,
        BiFunction<B, ? extends Object, B>,
        Function<? extends Object, B>>
        applyPartial = (b, m) -> (v) -> m.apply(b, v);

爪哇说:

File.java:[92,141]不兼容的类型:java.lang.对象不能转换为捕获#1?扩展java.lang.对象

列141是m.apply(b, v)中的v

为什么这个不会编译?

共有2个答案

鲁淇
2023-03-14

您有两个不同的?扩展对象,编译器无法确保它们是相同的。您需要为其命名,以确保两个位置的类型相同:

private BiFunction<B, BiFunction<B, C, B>, Function<C, B>> applyPartial =
   (b, m) -> (v) -> m.apply(b, v);
缑智敏
2023-03-14

在这种情况下,您必须命名您想要的类型来代替通配符捕获。Java无法确保两个捕获转换是等效的。

因为不能在函数调用中创建泛型类型,所以应该创建一个工厂函数来创建函数:

// Provided B is supplied as a class type
public <C> BiFunction<B, BiFunction<B, C, B>, Function<C, B>> createCurrier() {
    return (b, m) -> v -> m.apply(b, v);
}
// B is an explicit type parameter
public <B, C> BiFunction<B, BiFunction<B, C, B>, Function<C, B>> createCurrier() {
    return (b, m) -> v -> m.apply(b, v);
}
 类似资料:
  • 有25种类型的空白。在下面的代码中显示,25种类型中有4种在Java中不被视为空白。为什么? 参考-https://docs.oracle.com/en/java/javase/11/docs/api/java.base/java/lang/character.html#IsWhitespace(char)

  • 问题内容: 对于Java的处理方式以及涉及到的数字和其他类型的数字,我有些困惑。例如: 输出(也许您应该先猜测一下): 这不能编译是可以预料的,是不同的对象。 令我有些惊讶的是,默认情况下9是an ,并且1)甚至没有编译。请注意,您不能将放入期望使用的方法中,但是在这里它们是相等的。 由于两个相同的原因,这令人惊讶,但似乎更糟。 不足为奇,因为自动装箱到和。 不足为奇,因为不同类中的对象不应该是。

  • 问题内容: Java编译消息是什么: 的意思,以及如何解决。一些编译器使用不同的措词;例如 要么 (这旨在对涉及“ void”的非常具体的编译错误消息进行规范的问答,该错误消息会使新的Java程序员感到困惑。它的目的并非是关于Java中可能遇到的各种不同的“类型转换”问题的教程。 ) java 编译器错误 类型转换 无效 问题答案: 快速回答 编译器告诉你正在尝试使用不返回结果的方法的“结果”。

  • 我试图编译一个从SourceForge得到的仍在开发中的项目。这是它的地址:。https://sourceforge.net/p/groove/code/5475/tree/groove/trunk/我知道这个项目经过了很好的验证,它没有任何错误,但是当我要编译它的时候,我遇到了这个编译错误: 错误在这个文件的第370行:https://sourceforge.net/p/groove/code/

  • 我一直在尝试编写一个程序来实现任意域上的多项式,一种数学结构。我选择了Haskell作为编程语言,我使用了语言扩展。但是,我不明白为什么GHCi不能推导出的约束条件。 在我看来,保证是的实例,这意味着是的实例。所以调用就像调用一样,应该是合理的。此外,我已经编写了作为约束,并且的构造函数具有的形状,因此它还应该知道的类型是的实例。 显然,译员的想法不同。我哪里搞错了?