当前位置: 首页 > 面试题库 >

像在Java中使用内部接口一样,在Scala中实现内部特征

龙嘉玉
2023-03-14
问题内容

Java中的以下代码可正确编译:

interface T {
    interface Q {
    }
}

class C implements T.Q {
}

而Scala中的此代码不:

trait T {
    trait Q {
    }
}

class C extends T.Q {
}

Java代码清单到Scala的正确翻译(如果存在)是什么?

欢迎对语言设计进行理论解释。


问题答案:

内部类型Q仅针对特征的特定实例实现定义T。由于scala具有 依赖于路径的 类型,因此的每个实例T将具有自己的子特性Q

scala> trait T {
     |   trait Q
     | }
defined trait T

scala> class C extends T {
     |   def getQ: this.Q = new this.Q {}
     | }
defined class C

scala> val inC = (new C).getQ
inC: C#Q = C$$anon$1@3f53073a


scala> val c = new C
c: C = C@1a7e4ff0

scala> new c.Q {}
res4: c.Q = $anon$1@36bbb2f5

如果您需要一个接口来实现客户端的一般行为,并且不依赖于特定C实例,则应在Object

scala> object T {
     |   trait Q {
     |     def implementMe: Unit
     |   }
     | }
defined module T

scala> val inT = new T.Q {
     |   def implementMe = println("implemented!")
     | }
inT: T.Q = $anon$1@20f2a08b

scala> inT.implementMe
implemented!


 类似资料:
  • 问题内容: C ++具有多重继承。汇编级别的多重继承的实现可能非常复杂,但是在线上通常有很好的说明(vtable,指针修复,thunk等)。 Java没有多重实现继承,但是它确实具有多重接口继承,因此我认为每个类只有一个vtable的直接实现无法实现。java如何在内部实现接口? 我意识到与C++相反,Java是Jit编译的,因此不同的代码段可能会进行不同的优化,并且不同的JVM可能会做不同的事情

  • 我想在main函数中打印Tweet数据类型的实例,但摘要特征不实现调试特征。有没有办法在特征或任何工作上实现特征。取消注释第二行并注释第一行将工作,因为字符串类型实现了显示特征。 error[E0277]: 未实现 -- 错误:由于以前的错误而中止 有关此错误的更多信息,请尝试。错误:无法编译。 要了解更多信息,请使用--verbose再次运行该命令。

  • 问题内容: 因此,当研究lambda表达式并用它们代替Java中的EventHandlers的匿名内部类时,我遇到了一些匿名内部类,这些使我停下来思考。例如,当为通常实现ActionListener的东西编写匿名内部类时,我们会编写 我对此感到困惑,因为ActionListener是一个接口,所以我认为有必要做类似的事情… 但这甚至无法编译。我想我这样做的原因显然是如果我们使用私有内部类,而使用

  • 我的以下实现会导致编译器错误: 它在涉及FusionStat的第一行

  • 问题内容: 我将如何为正在实现接口的内部类编写构造函数?我知道我可以上一门全新的课,但是我认为必须有一种方法可以做到这一点: 当我输入此内容时,它不会将AbstractAction方法识别为构造函数(编译器要求返回类型)。有人有主意吗? 问题答案: 只需在扩展类的名称后面插入参数即可: 另外,您可以使用初始化块:

  • 问题内容: 我一直在寻找是否有某种方法可以使用中的类,但我还没有找到任何文档或有关此主题的指南。 假设我创建了一个简单的类,其中使用的一些库,例如: 有没有可能在此类中使用此类? 太难了吗? 我必须创建一个文件吗? 有没有指导说明如何做到这一点? 顺便说一句,我也看了一下代码,感到有点迷茫,我无法出于自己的目的复制它们的功能。 问题答案: 是的,尽管不是很琐碎,但它是可能的。通常,您需要一个Jav