Scala:如何强制提供类型



说我们有以下特质和类定义

trait Model extends Product
class X[T <: Model] {}

给上述我可以创建x的实例,如下所示。

val x = new X

编译器不抱怨。在这种情况下,推断的类型为Nothing。我想知道如何在编译时预防它,以便不允许在不提供明确类型的情况下创建X实例,即Model的子类型?

class X[T <: Model] {}类定义意味着 T类型具有上限Model类型。对于所有类型的所有类型,Nothing subtype 。那就是 scala编译器的原因没有抱怨。

使class X A contavarient T

class X[-T <: Model] {}

,当您定义

val x = new X 

它被Scala编译器处理为

x: X[Model] = X@7c9bdee9

我认为这有效:

trait Model
case class M() extends Model // one subclass of Model, for testing
// use implicit to force T to be convertible to Model
// which works for actual Model subclasses but not Nothing
class X[T<:Model](implicit f: (T) => Model)
new X
  error: type mismatch;
  found   : <:<[Nothing,Nothing]
  required: T => Model
new X[M] // ok

但是,您仍然可以显式将Nothing作为类型ARG(奇怪...(:

new X[Nothing] // ok

我会去上面的,但另一个想法是明确地通过参数的类:

class X[T<:Model](tClass: Class[T])
new X(classOf[M]) // ok
new X(classOf[Nothing])
  error: type mismatch;
  found   : Class[Nothing](classOf[scala.Nothing])
  required: Class[T]
  Note: Nothing <: T, but Java-defined class Class is invariant in type T.
  You may wish to investigate a wildcard type such as `_ <: T`. (SLS 3.2.10)

相关内容

  • 没有找到相关文章

最新更新