6

タイプパラメータTには特定のスーパータイプS_1が必要であると言えます。

class Test[T <: S_1] 

タイプパラメータには、複数のスーパータイプの選択肢のうち少なくとも1つのスーパータイプが必要であると言う方法はありますか?(擬似コード)のようなもの:

class Test[T <: S_1 || S_2] 

または:このような構造は意味がなく、コードの設計ミスのヒントになるため、これは不可能ですか?

4

2 に答える 2

9

簡単な答え:直感的な解決策は、型パラメーターに必要な一連の能力を表す共通の特性を作成S_1して共有することです。その特性をの上限として使用します。S_2TT

その他の可能性:

  • とが本質的に無関係であり、型の要件S_1が特定のメンバー(両方とがたまたま実装される)を持つことである場合、構造型を使用してそれを定式化できます(背後にある概念はダックタイピングと呼ばれます)。S_2TS_1S_2

  • 何らかの理由でまたはのサブクラスである必要がTあり、それらの型を変更できない場合は、暗黙的にこれらの両方を新しく導入された内部型に変換できます。これを、の上限として使用できます。。S_1S_2S_1_or_2T

于 2012-06-17T22:18:34.143 に答える
3

Niklasの2番目の選択肢について詳しく説明します。暗黙のパラメータを使用して型について何かを証明できるので、これはまさにそのように思えます。これは次のようになります。

class ThingIWantToProve[T]
object ThingIWantToProve {
  // Here I define the proofs I need
  implicit def s1IsProvable: ThingIWantToProve[S_1] = new ThingIWantToProve[S_1]
  implicit def s2IsProvable: ThingIWantToProve[S_2] = new ThingIWantToProve[S_2]
}
class Test[T : ThingIWantToProve] // here I use a context bound
于 2012-06-18T00:49:49.173 に答える