2013-09-17 3 views
9

Интересно, может ли использование дженериков классов классов Scala сохранить некоторый шаблонный код.Использование общих классов классов в Scala

Спасем У меня есть следующий класс hieararchy эмулировать типа «вариант», что коробки набор типов и позволяет распаковка их с помощью сопоставления с образцом:

sealed abstract class Box; 

case class DoubleBox(v: Double) extends Box; 
case class StringBox(v: String) extends Box; 
case class BooleanBox(v: Boolean) extends Box; 

def typeName(b: Box) = b match { 
    case DoubleBox(v) => "Double" 
    case StringBox(v) => "String" 
    case BooleanBox(v) => "Boolean" 
    case _ => "Unknown" 
} 

Там может быть места в коде, где он будет было бы более удобно иметь дело с классами листьев, если они были дженериками. Что-то вроде:

sealed abstract class Box; 

case class TypedBox[T](v: T) extends Box; 

def typeName2(b: Box) = b match { 
    case TypedBox[Double](v) => "Double" 
    case TypedBox[String](v) => "String" 
    case TypedBox[Boolean](v) => "Boolean" 
    case _ => "Unknown" 
} 

Но это не скомпилировано. Насколько я понимаю, этот синтаксис не признан действительным синтаксисом Scala.

Можно ли сделать то, что я хочу работать, или это плохая идея, и я просто ничего не получаю?

EDIT: Vinicius ответил на мой вопрос, но, глядя на ответ, у меня есть другой вопрос. Можно ли каким-либо образом намекнуть компилятору, что для параметров TypedBox можно использовать только определенный список типов? Я хочу, чтобы убедиться, что компилятор еще может выполнить проверку полноты использования/соответствия TypedBox.

ответ

20

Попробуйте

sealed abstract class Box; 

case class TypedBox[T](v: T) extends Box; 

def typeName2(b: Box) = b match { 
    case TypedBox(v: Double) => "Double" 
    case TypedBox(v: String) => "String" 
    case TypedBox(v: Boolean) => "Boolean" 
    case _ => "Unknown" 
} 
+0

Это работает, спасибо! –

0

Для второй части вопроса, есть два способа ограничить разрешенные типы.

Первым было бы установить привязку к типу, которая ограничивала бы допустимые типы, но не позволяла компилятору делать значимые проверки полноты, поскольку типы могли быть определены практически в любом месте или в любое время.

Второй будет обернуть тип в герметичной черте, но тогда вы, по сути создав класс случая для каждого типа, так что вы можете также удалить дополнительный слой упаковки и просто создать DoubleBox, StringBox и т.д.

Смежные вопросы