如果我写一些类似的东西:
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]()
.
那可能吗?
如果我写一些类似的东西:
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]()
.
那可能吗?
您可以使用此答案=!=
中的证据来强制执行以下操作之间的区别: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