簡體   English   中英

Scala:是否可以將類型參數約束為非抽象?

[英]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]
}

缺點是如果實例化ExampleClassT沒有no-arg構造函數,它將在運行時失敗...

關於NumericOrdering等,它們是類型類 ,是標准庫的一部分,不是語言的一部分。 您可以構建自己的類型類。 Manifest的情況很特殊,因為它確實得到語言的支持來提供隱式對象。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM