scala downcasting with generics

时间:2013-06-18 11:54:15

标签: scala generics downcast

我正在寻求以下问题的帮助:

case class A(val name: String)
class B(name: String) extends A(name)
class Base[T <: A](param: T)
class SubClass[T <: B](param: T)

object Factory {
  def create[T <: A](param: T) = {
    param.name match {
       case "something" => new Base(param)
       case "something else" => new SubClass(param)
    }
  }
}

工厂不能编译,因为param子类期望(T:&lt; B)和创建中T的定义不匹配,其中T:&lt; A.是否有一个干净的解决方案或我是否需要向下调用Subclass构造函数?这个垂头丧气的样子怎么样?

为了清楚 - 当子类由param构造时,param确实是T&lt;:B。

感谢。

2 个答案:

答案 0 :(得分:1)

为什么不先在param上匹配?

param match {
  case b : B => ...
  case a : A => ...
}

答案 1 :(得分:0)

如果提供type参数,则编译并运行OK:

case "something else" => new SubClass[T](param)

是否编译是否值得怀疑,因为如果匹配发生且ClassCastException不是T,它将在运行时给出B

清洁解决方案是按照Daniel所说的匹配类型。