Scala 2.12:对于普遍量化的SAM特征,Java 8方法参考的等价物是什
我的目标是通过新的
scala 2.12支持SAM(单一抽象方法)特征来实现代数数据类型(教会编码)的单例值.
在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,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". } } 我试图将此编码移植到scala 2.12但它不编译: @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"??? } } 我得到的错误是: 我的目标是让scalac触发Javac完成的相同优化,使java程序打印为“true”.只要它不使用asInstanceOf和Nothing / variance注释,我对满足scalac所需的任何东西都是开放的. 编辑:由于目前不支持,我为此开了一个feature request on the scala issue tracker(请投票给它!;-). 解决方法
不幸的是,根据
the specification不允许这样做:
(编辑:李大同) 【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容! |