簡體   English   中英

Scala泛型-T具有方法限制

[英]Scala Generics - T has method restrictions

我是scala泛型的新手,我已經閱讀了多篇有關視圖,類型綁定/上下文綁定的文章。 當我嘗試實現我的課程時,我真的很困惑。

我的問題是,假設我有一個模板類MyClass [T] {} 我希望T必須具有一些方法,例如:

def func1(t:T):T
def func2(t:T):Boolean
def func3(t:T):Unit

注意:將使用MyClass的類不是T,因此我不能使用:<或:>

我已經閱讀了有關具有隱式功能的Ordered和Ordering的信息,但是我仍然無法弄清楚如何實現它。

謝謝幫手

您可以使用typeclass做到這一點。 創建一個trait ,其中包含所需的方法,並為應支持的每種類型創建一個隱式實例:

trait MyTypeClass[T] {
  def func1(t:T):T
  def func2(t:T):Boolean
  def func3(t:T):Unit
}

implicit object MyTypeClassInt extends MyTypeClass[Int] {
  def func1(t:Int) = t + 2
  def func2(t:Int) = t > 4
  def func3(t:Int) = println(s"t is: $t")
}

現在,如果您在類中添加了綁定到類型參數的上下文,則只有當給定類型的實例在范圍內時,才能實例化該上下文。

class MyClass[A : MyTypeClass](a: A)

scala> new MyClass(2)
res0: MyClass[Int] = MyClass@47825164

scala> new MyClass("")
<console>:11: error: could not find implicit value for evidence parameter of type MyTypeClass[String]
              new MyClass("")**

您可以通過implicitly[MyTypeClass[A]]調用implicitly[MyTypeClass[A]]來訪問類中的實例。 或者,您可以執行以下任一操作:

1.)代替使用上下文綁定,將隱式參數添加到您的類中:

class MyClass[A](a: A)(implicit ev: MyTypeClass[A])

2.)為您的類型類添加一個同伴,該同伴具有一個apply方法,該同伴隱式地檢索該實例並將其返回:

object MyTypeClass {
  def apply[A](implicit ev: MyTypeClass[A]) = ev
}

並在您的班級中像這樣使用它:

MyTypeClass[A].func1(a)

暫無
暫無

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

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