gpt4 book ai didi

Scala 和 Java - 隐式参数和继承

转载 作者:行者123 更新时间:2023-12-04 23:58:06 24 4
gpt4 key购买 nike

以下代码给出了错误:

package test

trait Base {
def method:String
}

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

object Object extends Trait {

}

错误是 “无法创建对象,因为未定义类型 => String 的类 Base 中的方法方法”

上述错误已通过以下代码修复
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 接口(interface)时,而不是 Scala 类:
// 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 {

}

我收到一个错误 “对重载定义的模糊引用,类型 ()(隐式 i: String)String 的 trait Trait 中的方法方法和 ()String 类型的 trait Trait 中的方法方法匹配参数类型 ()”

这两种情况有什么区别使编译器表现不同?我该如何解决这个问题?

最佳答案

这是一个我认为清楚地显示正在发生的事情的例子:

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 :没有括号,但父类(super class)型确实有括号,所以还是不错的。这与您的情况相对应。
  • C : 没有括号,用括号调用,不好。

  • 基本上,Java 方法总是被认为是“带括号的”,所以, Trait的父类(super class)型有括号,所以在 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"

    此外,名称相同的事实并没有为您带来多态性方面的任何好处:只有非隐式方法覆盖 Base.method - 使名称相同只是一个美学决定。

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

    24 4 0
    Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
    广告合作:1813099741@qq.com 6ren.com