java - Scala 隐式类参数

标签 java scala

我有一个类,其隐式参数定义为:

 class Test(implicit one: String)

我想像这样实例化该对象:

val grr = new Test("aha")

我收到以下异常。

error: too many arguments for constructor Test: ()(implicit one: String)Test
       val grr = new Test("aha")

但是如果我这样调用它

val grr = new Test()("haha")
grr: Test = Test@3bd40a57

我得到一个测试对象。<​​/p>

为什么 Scala 实例化隐式方法要求您在此实例中调用带有空白参数的对象?为什么为此类对象实例提供隐式空白参数列表?

最佳答案

首先,Test 不是一个隐式类。请参阅this有关隐式类的讨论。

相反,Test 是一个没有显式构造函数参数但有一个隐式 String 参数的类。这意味着实例化 Test 的唯一方法是像您一样显式提供隐式参数,这很尴尬并且达不到目的,或者提供一个且仅有一个 String 在实例化时的隐式范围内,并让编译器“拾取它”。

换句话说,如果您的范围内有类似的内容:

implicit val s: String = "haha"

那么实例化 Test 所需要做的就是:

val grr = new Test

如果范围内没有,编译器会让您知道。这是一件好事。

最重要的是确保您了解隐式参数和隐式类之间的区别。

关于java - Scala 隐式类参数,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/42657125/

相关文章:

JavaMail - 客户端未经过身份验证,无法在 MAIL FROM 期间发送匿名邮件

java - JPA 查询 MONTH/YEAR 函数

java - 添加到 TreeSet 时记录位置

scala - 如何使用akka管理用户的游戏状态

Scala——映射和过滤操作是线性时间的吗?

java - 获取字符串的一部分直到某个点

java - 如何加快获取图像和文本的jdbc sql查询速度

Scala:我有一个 Set[X] 和函数 (X) => Future[Y] 并想输出一个 Future[Map[X, Y]]

scala - JSON 格式的 Spark DataFrame 列上的隐式模式发现

scala - 将 jooq-sbt-plugin 与 ojdbc 一起使用