2012-03-07 19 views
14

ObjectAとObjectBという2つのオブジェクトがあり、いずれもメソッドupdate()を使用しています。私は、ObjectAまたはObjectBのいずれかを受け付ける関数を記述したいと思います(他の型はありません)。概念的には、これは私がしようとしているものです:スカラーのパラメータに複数の型を受け入れる

def doSomething[T <: ObjectA | T <: ObjectB](obj: T) = { 
    obj.update 
} 

私はそこにこの問題を解決するための他の方法(例えば、更新の構造的なタイピング()メソッド、共通の基底クラス、など)があるが、私の質問があり実現しますこれをScalaでこのようにすることができます。もしそうなら、構文は何ですか?それは何と呼ばれていますか?

+0

: 基本的に、あなたのような何かをしますか?どのような型であるのか分からなければ、どのようなメソッド 'T'があったのか、コンパイラはどのように知っていますか?あなたのクラスが 'update'を持っていることを確認することを意味するなら、それは構造型のためのものです。 – dhg

+4

の可能な複製[スカラに「型の分離」(連合型)がありますか?](http://stackoverflow.com/questions/3508077/does-scala-have-type-disjunction-union-types)受諾された回答と次の最も高いランク付けの両方を参照して、私のボックス化されていない組合エンコーディングは直接この質問を解決します。 –

+0

@dhg ObjectAとObjectBの両方にメソッドupdate()があり、タイプTがこれらのクラスのどちらか一方を拡張している場合、型Tにupdate()メソッドがあることがわかります。 –

答えて

15

Scalaには、分離型の結合を作成する型があります。

あなたは、これが動作するように期待する方法
def doSomething(obj: Either[ObjectA, ObjectB]) { 
    obj.fold(fa, fb) 
} 

アウトhttp://www.scala-lang.org/api/current/scala/Either.html

+1

あなたがそれらを1つとして扱いたいなら、さらに構造体型を使うことができます: 'obj.fold [{def update:Unit}](identity、identity).update' –

+1

faまたはfbがどこから来たのか分かりませんあなたの例またはobjでfold()を呼び出すのはなぜですか?どちらもこれを行う最もクリーンな方法です。ありがとう。 –

+0

@Bigwheels私は間違っているかもしれないので、あなたの問題の文脈を知るために交渉しているだろうが、実際には同じ機能を2つの可能な組合のオブジェクトに適用することは感心しない。基本的には、faとfbは、ObjectAまたはObjectBを使用している場合のクロージャです。私は私の例でそれらを定義しませんでした。あなたは、どちらかを使わずにMiles Sabinがあなたの質問についてコメントしているかどうかチェックする必要があります。しかし、かなりテクニカルタイプのハッキングです。 – blouerat

関連する問題