[英]How to access a class's type parameter in Scala
我有一個類型參數化的抽象類,它包含一個val和一個都使用其類型參數的方法
abstract class Foo[T](val state: T){
def foo(arg: T){
...
}
}
我還有一個擴展這個抽象類的類,它提供了type參數和state
的值
class Bar(myNumber: Int) extends Foo[Int](myNumber){
...
}
我將一個Bar
實例傳遞給另一個接受Foo
子類的類,我想調用方法foo
on state
,但是我遇到了一些麻煩:
class Baz(val f: Foo[_]){
f.foo(f.state)
}
這給出了錯誤:
<console>:8: error: type mismatch;
found : Baz.this.f.state.type (with underlying type _$1)
required: _$1
f.foo(f.state)
有沒有辦法讓Baz
知道Bar
的類型參數,以便正確編譯? 或者甚至是我想做什么?
編輯
為了澄清,我有許多類似於Bar
類,它們擴展了Foo
並提供了它們自己的類型參數,狀態和foo
實現。 我希望我的庫的用戶能夠將其中的任何一個傳遞給Baz
而不必擔心類型參數T
因為它只是Foo
的每個子類的實現細節。
所以我強烈不願意這樣做:
class Baz[T](val f: Foo[T]){
f.foo(f.state)
}
你只需要一個
def fooOnState[T](ft: Foo[T]) = ft.foo(ft.state)
用Foo[_]
調用它是好的。
盡管如此,大多數時候最好避免存在,但這取決於你的真實代碼。
用特征中的“類型成員”替換type參數將允許您編寫適用於所有狀態類型的通用代碼,但代價是在每個子類中指定類型成員有點冗長:
trait Foo {
type StateT // this is the "type member"
val state: StateT
def foo(arg: StateT): Unit
}
class Bar(myNumber: Int) extends Foo {
type StateT = Int // this is the verbose part
override val state = myNumber // this, too
override def foo(arg: StateT) { /* something specific here */ }
}
class Baz(val f: Foo) {
f.foo(f.state) // generic code, works on any Foo subclass
}
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.