[英]Scala: Is it possible to constrain a type parameter to be non abstract?
Scala:是否可以將類型參數約束為非抽象?
除了視圖邊界,類型參數的上限和下限以及抽象類型成員之外,是否還有其他約束? 例如,在我熟悉的C#中,您有其他通用約束:
其中T:Class //不確定Scala中是否包含T <:AnyRef
其中T:接口
其中T:struct
其中U:T //裸體約束
其中T:new()//這可以確保類型參數是非抽象的,並允許實例化泛型類中的類型對象。
最后一個特別重要,因為它允許你構造你的未知類型,雖然很遺憾你只能禁止無參數構造函數。
Can =:= <:<和<%<僅用於方法參數?
在回應評論時,問題的直接觸發因素是需要“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#中沒有的一個約束是“T:numericType”這個問題已經在Scala中解決了。 我仍然非常喜歡使用Scala語言,所以除了上述內容之外,我只是想在Scala語法的這個方面確切地說明哪些工具是不可用的,即使我不這樣做我知道如何在Scala上下文中使用它們。
我不確定這是否完全相關,但有時似乎編譯器(帶有Eclipse 3.7.2的Eclipse 2.1.0.M1)將不允許我實例化未知元素類型的集合。 以下代碼現在似乎編譯好了。 所以我想知道規則是什么:
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
}
通常使用Manifest
來解決對new T()
的需求。 例如,此代碼編譯:
class ExampleClass[T: Manifest] {
val example: T = manifest[T].erasure.newInstance().asInstanceOf[T]
}
缺點是如果實例化ExampleClass
的T
沒有no-arg構造函數,它將在運行時失敗...
關於Numeric
, Ordering
等,它們是類型類 ,是標准庫的一部分,不是語言的一部分。 您可以構建自己的類型類。 Manifest
的情況很特殊,因為它確實得到語言的支持來提供隱式對象。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.