3

Scala:型パラメーターを非抽象化するように制約することは可能ですか?

型パラメーターと抽象型メンバーのビュー境界、上限、下限を除いて、他の制約は可能ですか?たとえば、私がよく知っているC#では、追加の一般的な制約があります。

ここでT:クラス//これがScalaでT <:AnyRefによってカバーされているかどうかわからない

ここで、T:インターフェース

ここで、T:構造体

ここで、U:T//裸のタイプの制約

ここで、T:new()//これにより、型パラメーターが非抽象的であり、ジェネリッククラスの型のオブジェクトをインスタンス化できるようになります。

最後の1つは、未知の型を作成できるため特に重要ですが、残念ながら、パラメーターのないコンストラクターしか禁止できません。

=:= <:<および<%<はメソッドパラメータでのみ使用できますか?

コメントに応えて、質問の直接のきっかけは、「T:new()」拘束または同等のメカニズムの必要性でした。

class ExampleClass[T <: AnyRef] {
  val example: T = new T()//Won't compile as the compiler  
} //doesn't know if such a constructor exists

一部のC#制約の使用は、C#のニーズに固有のものです。たとえば、C#にはない、人々が常に望んでいる制約の1つは、「T:numericType」です。この問題はScalaですでに解決されています。私はまだScala言語をブートストラップしているので、上記とは別に、Scala構文のこの側面では、ツールが何であり、利用できないのかを正確に明らかにしようとしていました。 Scalaのコンテキストでそれらをどのように使用したいかをまだ正確に知っています。

これが完全に関連しているかどうかはわかりませんが、コンパイラ(Eclipse2.1.0.M1とEclipse3.7.2)では、不明な要素タイプのコレクションをインスタンス化できない場合があります。次のコードは正常にコンパイルされるようになりました。だから私はルールが何であるか知りたいです:

abstract class Descrip [T <: DTypes]()
{      
  val hexs: MutableList[T#HexT] = new  MutableList[T#HexT] //compiles fine
  val sides: MutableList[T#SideT] = new MutableList[T#SideT] //compiles fine
}
4

1 に答える 1

1

の必要性new T()は、通常、Manifests を使用して解決されます。たとえば、次のコードはコンパイルされます。

class ExampleClass[T: Manifest] {
  val example: T = manifest[T].erasure.newInstance().asInstanceOf[T]
}

欠点は、インスタンス化されたTfor にExampleClass引数のないコンストラクターがない場合、実行時に失敗することです...

、 などに関してNumericOrdering、それらは型クラスであり、標準ライブラリの一部であり、言語の一部ではありません。独自の型クラスを作成できます。の場合はManifest、暗黙的なオブジェクトを提供するために言語からサポートされているため、特別です。

于 2012-05-24T23:12:25.413 に答える