2012-07-02 128 views
1

类型我有以下类型实例化类类型参数具有可变的斯卡拉

class Translator[To <: Language] { ... } 
abstract class Language 
object English extends Language 
object German extends Language 

有没有一种方法来实例化从val要么是English型或GermanTranslator

我正在寻找类似如下(不工作):

val lang = if (someCondition) English else German 
val translator = new Translator[classOf[lang]] 

回答

3

使用的语言类型参数in Translator构造函数:

class Translator[To <: Language](lang:To) {...} 
abstract class Language 
object English extends Language 
object German extends Language 

new Translator(German) 
res7: Translator[German.type] = [email protected] 

// using class instead of object: 
class Italian extends Language 
new Translator(new Italian) 
res9: Translator[Italian] = [email protected] 
+0

我更喜欢这个答案,因为它仍然使用泛型类型。 – pvorb

5

的问题是,无论是EnglishGerman是类。你确定你在这里需要通用性吗?也许组成就足够了。一个可能的解决方案是:

val lang = Translator(if (someCondition) English else German) 

与下面的类和对象:

case class Translator(l: Language) 
trait Language 
object English extends Language 
object German extends Language 

但它是一个完全不同的设计,比你预计的单...

+0

谢谢你的快速答复。你的第二点是我的代码中的一个错误。我修好了它。我只是删除了太多的样板来澄清我的问题。我不确定“英语”和“德语”不是课程会出现什么问题。 – pvorb

+0

好吧,我相应地改变了我的答案。但问题是:在这里使用泛型是否有很好的理由? – Nicolas

+0

你不知道为什么我在这里实际使用泛型类型。在我的代码中,每种语言都有自己的'apply'方法,它本身具有泛型类型。这种类型定义了可以通过“翻译器”翻译的术语枚举。所以实际上'Translator'有第二个类型参数,适用于它的'apply'方法。 – pvorb

0

只是实例化Translator的类型GermanEnglish这样的:

new Translator[German.type] 

编辑:

或从val

val x = German 
new Translator[x.type] 
+0

答案是正确的,但不回答我的问题('val')。 – pvorb

+0

编辑我的答案 – drexin