1

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

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)
    }
  }
}

由于子类期望的参数 (T :< B) 与 create which isT :< A 中的 T 定义不匹配,工厂无法编译。是否有一个干净的解决方案,或者我需要在调用子类构造函数?沮丧会是什么样子?

需要明确一点 - 当 Subclass 是用 param 构造的,param 确实是 T<: B。

谢谢。

4

2 回答 2

1

你为什么不先匹配参数?

param match {
  case b : B => ...
  case a : A => ...
}
于 2013-06-18T14:42:28.003 回答
0

如果您提供类型参数,这将编译并运行正常:

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

它是否应该ClassCastException编译是有问题的,因为如果匹配发生并且T不是 a ,它将在运行时给出a B

正如丹尼尔所说,更清洁的解决方案是匹配类型。

于 2013-06-18T14:53:38.970 回答