繁体   English   中英

了解Scala类型推断和扩展类型

[英]Understanding Scala type inference and extensial types

中有以下课程:

class MyClass[T <: Enum[T]](val clazz: Class[T]){
  def dummy = println(clazz.toString)
}

和方法

def createMyClass(clazz: Class[_]) =
  if(clazz.isEnum)
    new MyClass(clazz.asInstanceOf[Class[Enum[T] forSome { type T <: Enum[T] }]]) //error
  else throw new IllegalArgumentException(s"$clazz is not an enum")

但是,尽管Enum[T]满足类型约束T <: Enum[T]但它拒绝编译。 如果我编写Class[T forSome { type T <: Enum[T] }]可以使用。

但是为什么在第一种情况下不起作用?

因此,只需仔细检查,我就能理解问题所在:

这有效:

def createMyClass(clazz: Class[_]) =
    if(clazz.isEnum)
        new MyClass(clazz.asInstanceOf[Class[T forSome { type T <: Enum[T] }]])
    else 
        throw new IllegalArgumentException(s"$clazz is not an enum")

这不是:

def createMyClass(clazz: Class[_]) =
    if(clazz.isEnum)
        new MyClass(clazz.asInstanceOf[Class[Enum[T] forSome { type T <: Enum[T] }]]) 
    else 
        throw new IllegalArgumentException(s"$clazz is not an enum")

这是因为类型不对齐。 MyClass需要一个“ T,其中T是Enum [T]的子类”。 您传入的是'Enum [T],其中T是Enum [T]的子类。 例如,如果您将MyClass定义为以下示例,则哪个可以互换:

class MyClass[T <: Enum[T]](val clazz: Class[Enum[T]]){
    def dummy = println(clazz.toString)
}

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM