gpt4 book ai didi

scala - 如何在也只接受子类的 Scala 中进行结构类型化?

转载 作者:行者123 更新时间:2023-12-02 08:51:42 24 4
gpt4 key购买 nike

我不想用文字描述问题,而是向您展示一个 Scala Interpreter session ,展示我想做的事情。

    scala> class A extends Parent{
| def name = "Alex"
| }
defined class A

scala> class B extends Parent{
| def name = "Bernardo"
| }
defined class B

scala> def addFamilyName[T <: Parent](fn:String, c:T{def name():String}) = c.name + " " + fn
addFamilyName: [T <: Parent](fn: String, c: T{def name(): String})java.lang.String

scala> addFamilyName( "Martins", new A())
<console>:11: error: type mismatch;
found : A
required: ?{def name(): String}
addFamilyName( "Martins", new A())
^

所以基本上我想在参数中定义一个类型,它既是某个类型的子类,又包含一个带有签名 def name():String 的方法。 .

注意:我正在尝试这样做,因为我的类层次结构已经很复杂了。鉴于此,我宁愿不添加 <strong>ParentWithName</strong> abstract classtrait如果可以避免的话。

最佳答案

信不信由你,问题出在方法签名的括号中。这有效:

def addFamilyName[T <: Parent](fn:String, c:T{def name:String}) =
c.name + " " + fn

不过我应该补充一点,您实际上并不需要类型参数。这同样好:

def addFamilyName(fn:String, c:Parent{def name:String}) =
c.name + " " + fn

关于scala - 如何在也只接受子类的 Scala 中进行结构类型化?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/8144962/

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