要求用户在Scala的方法中提供[Type]?

时间:2013-06-23 09:45:24

标签: scala generics inheritance

如果我写下以下内容:

class A

class B {
  def add[T <: A]() = { ... }
}

那么当他致电T时,如何要求用户提供B.add类型?这两个调用编译:

class C extends A

class D extends A {
  val b = new B
  b.add()      // 1.
  b.add[C]()   // 2.
}

我希望1.生成编译时错误,而不是默认为b.add[D]()

这可能吗?

1 个答案:

答案 0 :(得分:7)

您可以使用this answer中的=!=个证据强制执行AT之间的差异:

def add[T <: AnyRef](implicit e: T =!= AnyRef) = null.asInstanceOf[T]

scala> add
<console>:10: error: ambiguous implicit values:
 both method equal in trait LowerPriorityImplicits of type [A]=> =!=[A,A]
 and method nequal in object =!= of type [A, B](implicit same: =:=[A,B])=!=[A,B]
 match expected type =!=[T,AnyRef]
              add
              ^

scala> add[String]
res1: String = null