2012-01-10 9 views
3

Scalaの抽象タイプをDRY /簡単な方法で使用する方法を理解するのは少し苦労しています。のは、私は、次があるとしましょう:クラスの定義を単純化するために、Scalaの抽象型で 'nesting'を使用できますか?

trait Product 
trait Pallet[A <: Product] 
class Import[ 
    A <: Product, 
    B <: Pallet[A]] { 

    def offload(): List[A] = { 
    ... 
    } 
} 

class Fridge extends Product 
class FridgePallet extends Pallet[Fridge] 

val fridges = new Import[Fridge, FridgePallet]() 

これは動作しますが、それは少し冗長に感じている - コンパイラがFridgePalletFridgeで入力され知っていることを考えると、の必要性を取り除くためにImportクラスのタイピングを簡略化する方法があります明示的なA <: Product宣言?私も_秒でA Sを交換しようとした

class Import[B <: Pallet[A <: Product]] { 
    def offload(): List[A] = ... 
} 
val fridges = new Import[FridgePallet]() 

- その後私は取得する.asInstanceOf[List[Fridge]]キャストを使用する必要があります:私は、私は(動作しない)、次のようなものを探しています推測します型特異性はoffload()出力に戻ります。

私は何かが分からない/わからないのですか?

答えて

4

私はジェネリック型に滞在しながら、これを行う方法を参照してくださいませんが、その代わり型メンバを使用することができれば、あなたはこの取得:

trait Product 
trait Pallet { 
    type A <: Product 
} 
class Import[B <: Pallet] { 
    def offload(): List[B#A] = { ... } 
} 

class Fridge extends Product 
class FridgePallet extends Pallet { 
    type A = Fridge 
} 

val fridges = new Import[FridgePallet]() 
+0

感謝**アレクセイ**を - これはうまくいきます: 'offload'は' List [Fridge] 'を返します。私はあなたが正しいと信じています - ジェネリックタイプでこれを行う方法はありません。** iron9light **のハイブリッドアプローチ(ジェネリックタイプは親の特性に型メンバーを設定します)を得る方法があるかどうかはわかりません。 ... –

2
trait Pallet[A <: Product] { 
    type ptype = A 
} 

class Import[P <: Pallet[_]] { 
    def offload(): List[P#ptype] = ... 
} 
+0

ありがとうiron9light - これは素敵で簡潔ですが、残念ながら 'List [P#ptype]'は使用中のList [Any]に解決されるので、実際には何も得られません... –

関連する問題