typeSpecific
不是静态成员,它属于SubA
和SubB
的实例,您没有这个实例。你也不能静态访问类型参数中的任何东西(它是一个类型,而不是一个对象)。
这不会按原样工作,因为您没有SubA
和SubB
的实例,您也不能通过new Tester[SubA]
获取它们。但是,您可以要求Tester
以Super
的类型混合,以使其成为一个(因此具有typeSpecific
)。这需要您将Super
,SubA
和SubB
更改为特征,并且还会使您的实例成为匿名类。
trait Super {
def typeSpecific: Int
}
trait SubA extends Super {
def typeSpecific = 1
}
trait SubB extends Super {
def typeSpecific = 2
}
// The self-type `this: A =>` requires the mix-in.
class Tester[A <: Super] { this: A =>
def test = typeSpecific
}
val testerA = new Tester[SubA] with SubA
val testerB = new Tester[SubB] with SubB
scala> testerA.test
res2: Int = 1
scala> testerB.test
res3: Int = 2
你也可以要求A <: Super
作为构造参数Tester
,这可能是更清洁的选择。
abstract class Super {
def typeSpecific: Int
}
class SubA extends Super {
def typeSpecific = 1
}
class SubB extends Super {
def typeSpecific = 2
}
class Tester[A <: Super](s: A) {
def test = s.typeSpecific
}
val testerA = new Tester(new SubA)
val testerB = new Tester(new SubB)
scala> testerA.test
res5: Int = 1
scala> testerB.test
res6: Int = 2
你把它的任何方式,你会需要的SubA
或SubB
一个实例。
Scala没有的“静态”在Java关键字 –
我同意价值感的概念!我在标题中的引号中加上了“静态”,所以希望能让问题更清楚。 –