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關鍵字 –
我同意價值感的概念!我在標題中的引號中加上了「靜態」,所以希望能讓問題更清楚。 –