如果我写下以下内容:
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]()
。
这可能吗?
答案 0 :(得分:7)
您可以使用this answer中的=!=
个证据强制执行A
和T
之间的差异:
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