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

Scala和Java-隐式参数和继承

东方新霁
2023-03-14
package test

trait Base {
  def method:String
}

trait Trait extends Base {
  def method()(implicit i:String):String = { "2" }
}

object Object extends Trait {

}
package test

trait Base {
  def method:String
}

trait Trait extends Base {
  def method:String = method()("String") // Over loading
  def method()(implicit i:String):String = { "2" }
}

object Object extends Trait {

}
// Java Code
package test;

public interface JBase {
  String method();
}

// Scala Code
package test

trait Trait extends JBase {
  def method:String = method()("10")
  def method()(implicit i:String):String = { "2" }
}

object Object extends Trait {

}

在这两种情况下,使编译器行为不同的区别是什么?如何解决此问题?

共有1个答案

郭麒
2023-03-14

这里有一个例子,我认为它清楚地表明了发生了什么:

object Test extends App {
    class A { def f(): String = "x" }
    class B extends A { override def f: String = "y" }
    class C { def f: String = "z" }

    println { (new A).f() } // OK
    println { (new B).f() } // OK
    println { (new C).f() } // FAILS
}
  • A:有括号,用括号调用,一切都好。
  • b:没有括号,但是supertype确实有括号,所以仍然很好。这符合您的情况。
  • C:没有括号,用括号调用,不好。

基本上,Java方法总是被认为“带有圆括号”,所以trait的超类型有圆括号,所以在method()(“string”)中使用圆括号不足以澄清您指的是哪种方法。

trait Trait {
    def method: String = method()("x")
    def method()(implicit i: String): String = i
}

val t = new Trait { }
implicit val s = "y"

println { t.method }
> "x"

println { t.method() }
> "y"
 类似资料:
  • 一、隐式转换 1.1 使用隐式转换 隐式转换指的是以 implicit 关键字声明带有单个参数的转换函数,它将值从一种类型转换为另一种类型,以便使用之前类型所没有的功能。示例如下: // 普通人 class Person(val name: String) // 雷神 class Thor(val name: String) { // 正常情况下只有雷神才能举起雷神之锤 def hamm

  • 关于非静态成员函数,请参见 常量、volatile和ref限定成员函数 其中提到: 非静态成员函数可以不使用ref限定符,也可以使用左值ref限定符(标记 no ref-限定符:隐式对象参数具有引用cv限定X的左值类型,并且还允许绑定右值隐式对象参数 左值引用限定符:隐式对象参数具有引用cv限定X的左值类型 rvalue ref限定符:隐式对象参数的类型rvalue reference指向cv限定

  • 问题内容: 此代码似乎正常工作 方法类型参数是否会遮盖类类型参数? 另外,在创建对象时,它是否使用类的type参数? 例 在它们 不冲突 的情况下,这通常适用于类的类型参数 吗? 我的意思是,当只有类具有类型参数而不是构造函数时,还是在构造函数中查找类型参数?如果他们 确实发生冲突 ,这将如何改变? 请参阅下面的讨论 如果我有一个函数调用 问题答案: 您所有的都不同,但是只有使用完整的语法调用方法

  • 可以通过 RpcContext 上的 setAttachment 和 getAttachment 在服务消费方和提供方之间进行参数的隐式传递。 1 在服务消费方端设置隐式参数 setAttachment 设置的 KV 对,在完成下面一次远程调用会被清空,即多次远程调用要多次设置。 RpcContext.getContext().setAttachment("index", "1"); // 隐式传

  • 好的,所以我对返回Akka Futures的函数进行了一系列调用,并且我通过使用flatMap和map将它们链接起来,如下所示: 其可以分布在不同的函数调用中。现在,这些doAsyncCallX调用中的每一个都返回一个未来的[Result],我希望能够合成这些结果,在链上传递它们,直到最后我可以返回链中所有结果的合成结果。 为此,我考虑让每个doAsyncCallX接收前一个结果的隐式参数,并将获