2

如果我写一些类似的东西:

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]().

那可能吗?

4

1 回答 1

7

您可以使用此答案=!=中的证据来强制执行以下操作之间的区别: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
于 2013-06-23T10:04:40.907 回答