加入收藏 | 设为首页 | 会员中心 | 我要投稿 李大同 (https://www.lidatong.com.cn/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 综合聚焦 > 服务器 > 安全 > 正文

Scala 2.12:对于普遍量化的SAM特征,Java 8方法参考的等价物是什

发布时间:2020-12-16 10:01:00 所属栏目:安全 来源:网络整理
导读:我的目标是通过新的 scala 2.12支持SAM(单一抽象方法)特征来实现代数数据类型(教会编码)的单例值. 在Java中,以下程序返回true: import java.util.function.Function;import java.util.function.Supplier;@FunctionalInterfacepublic interface MaybeA { X X
我的目标是通过新的 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"???
  }
}

我得到的错误是:
扩展函数缺少参数类型((x $1:<错误>,x $2:<错误>)=> empty0(x $1,x $2))

我的目标是让scalac触发Javac完成的相同优化,使java程序打印为“true”.只要它不使用asInstanceOf和Nothing / variance注释,我对满足scalac所需的任何东西都是开放的.

编辑:由于目前不支持,我为此开了一个feature request on the scala issue tracker(请投票给它!;-).

解决方法

不幸的是,根据 the specification不允许这样做:

It follows that:

  • if class C defines a constructor,it must be accessible and must define exactly one,empty,argument list;

  • m cannot be polymorphic;

  • it must be possible to derive a fully-defined type U from S by inferring any unknown type parameters of C.

(编辑:李大同)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

    推荐文章
      热点阅读