2013-06-18 1 views
1

Я ищу помощь со следующей проблемой:Scala понижающего приведения дженерик

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) и определение из T в создании, который isT: < A. Есть ли для этого чистое решение или мне нужно сбрасывать при вызове конструктора подкласса? как бы выглядел понижающий?

Просто чтобы быть ясно - когда Подкласс contructed с парами, пары действительно Т <: Б.

Спасибо.

+0

'T: senia

+0

'класс B extends A' не компилируется для запуска ... –

+0

спасибо за ваши комментарии senia и luigi. фиксированные опечатки. Он компилируется отдельно от рассматриваемого вопроса. – user1467422

ответ

1

Почему вы не согласны с параметром во-первых?

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

компилируется и работает нормально, если вы поставляете параметр типа:

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

ли должен компиляции сомнительна, так как это даст ClassCastException во время выполнения, если это совпадение происходит и T является не B.

Чистое решение должно соответствовать типу, как говорит Даниэль.

+1

У кого-нибудь есть объяснение, почему это делает typecheck? –