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

标签 scala generics inheritance

如果我按照以下方式写一些东西:

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=!= 证据强制执行 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

关于scala - 要求用户在 Scala 的方法中提供 [Type]?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/17259506/

相关文章:

java - 使用 JodaTime/scala 的时区转换时间

scala - 我可以使用@switch 和枚举吗?

c# - 如何修复此错误?无效方差 : The type parameter 'T' must be invariantly valid on

generics - 为什么无法推断泛型类型?

c# - 覆盖子类中的 ReadOnly 属性以使其读/写(VB.NET 或 C#)

scala - 通过反射列出 Scala 嵌套对象方法

scala - Scala 的 Actor 是否有任何非阻塞 IO 开源实现?

java - 简单的 Java 泛型应该显示编译错误,但事实并非如此

r - 带有附加参数的 S4 类 [(子集)继承

ios - 对对象的引用返回 null(iOS 类继承)