如果我按照以下方式写一些东西:
class A
class B {
def add[T <: A]() = { ... }
}
那么我如何要求用户在调用B.add
时提供类型T
?这两个调用编译:
class C extends A
class D extends A {
val b = new B
b.add() // 1.
b.add[C]() // 2.
}
我希望 1.
生成编译时错误,而不是默认为 b.add[D]()
。
这可能吗?
最佳答案
您可以使用来自 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
关于scala - 要求用户在 Scala 的方法中提供 [Type]?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/17259506/