Scala 2.12:对于通用量化的SAM特性,Java 8方法参考的等价物是什么?

Scala 2.12:对于通用量化的SAM特性,Java 8方法参考的等价物是什么?,java,scala,java-8,scala-2.12,Java,Scala,Java 8,Scala 2.12,我的目标是通过SAM(单一抽象方法)特性的新scala 2.12支持实现代数数据类型(church编码)的单例值 在Java中,以下程序返回true: import java.util.function.Function; import java.util.function.Supplier; @FunctionalInterface public interface Maybe<A> { <X> X fold(Supplier<X> empty, F

我的目标是通过SAM(单一抽象方法)特性的新scala 2.12支持实现代数数据类型(church编码)的单例值

在Java中,以下程序返回
true

import java.util.function.Function;
import java.util.function.Supplier;

@FunctionalInterface
public interface Maybe<A> {

  <X> X fold(Supplier<X> empty, Function<A, X> just);

  static <A, X> X empty0(Supplier<X> empty, Function<A, X> just) {
    return empty.get();
  }

  static <A> Maybe<A> empty() {
      return Maybe::empty0;
  }

  static void main(String[] args) {
    Maybe<?> emptyString = Maybe.<String>empty();
    Maybe<?> emptyInt = Maybe.<Integer>empty();

    System.out.println(emptyString == emptyInt); // print "true".
  }
}
我得到的错误是:
扩展函数缺少参数类型((x$1:,x$2:)=>empty0(x$1,x$2))

我的目标是使scalac触发器与Javac所做的优化相同,使java程序打印为“true”。我愿意接受满足scalac所需的任何东西,只要它不使用
替代
/variance注释


编辑:由于目前不支持此操作,我为此打开了一个窗口(请投赞成票!;-)。

不幸的是,根据以下规定,此操作是不允许的:

因此:

  • 若C类定义了一个构造函数,那个么它必须是可访问的,并且必须只定义一个空的参数列表

  • m不能是多态的

  • 通过推断C的任何未知类型参数,必须能够从S派生出完全定义的类型U


如果将empty的定义替换为:
def empty[A]:可能[A]=empty0
,会发生什么情况?请注意,我没有安装scala 2.12,也无法实际检查这是否是有效的响应。然后我得到
错误:(11,33)多态表达式无法实例化为预期类型[…]缺少对象中方法empty0的参数列表可能只有在预期函数类型时,未应用的方法才会转换为函数。您可以通过编写“empty0\u0”或“empty0(\u0,0)”而不是“empty0”来明确此转换。def empty[A]:可能[A]=empty0你的意思是你试图让编译器为你连接起来,而不是显式地指定参数的去向?我只是想让scalac触发Javac所做的优化,使程序打印为“true”。我愿意接受满足scalac所需的任何东西,只要它不使用
替代
不使用
。我看到这方面的功能请求是在yep打开的,我在Alexey回答后打开了它。添加问题的链接。
@FunctionalInterface
trait Maybe[A] {
  def fold[X](empty: => X, just: A => X): X
}

object Maybe {
  def empty0[A, X](empty: => X, just: A => X): X = empty

  def empty[A]: Maybe[A] = empty0(_ ,_) // does not compile

  def main(args: Array[String]): Unit = {
    val emptyString: Maybe[String] = Maybe.empty
    val emptyInt: Maybe[Integer] = Maybe.empty

    print(emptyString eq emptyInt) // how to make this print "true"???
  }
}