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
}