簡體   English   中英

如何在Scala中訪問類的類型參數

[英]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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM