2015-02-11 33 views
0

全部!用scala语言创建子类的使用类型参数

我想使用类型参数创建子类,但斯卡拉给"error: class type required but T found"。例如:

abstract class Base {def name:String} 
class Derived extends Base {def name:String = "Derived"} 
class Main[T <: Base] 
{ 
    class SubBase extends T {}; // <--- error: class type required but T found 
    val x:SubBase; 
    println(x.name) 
} 
val m:Main[Derived] 

我想这种方式,而不是正常的继承,因为在实际的代码,我懒的变量,在Base和宣布,以Derived定义,这些变量应该在Main类执行计算

如何我可以做到?在此先感谢

+0

这是不可能的,部分原因是由于没有运行时代码生成,因此类型擦除。在这种情况下,我认为组合优于继承。 – 2015-02-11 19:41:52

回答

1

您可以使用自类型来达到类似的效果:

abstract class Base {def name:String} 
class Derived extends Base {def name:String = "Derived"} 
class Main[T <: Base] 
{ 
    trait SubBase { this: T => }; 
    val x:SubBase; 
    println(x.name) // <--- error: value name is not a member of x 
} 
val m:Main[Derived] 

然而,这样只会让您使用的T成员的类中。因此,你还可以有SubBase延长Base

abstract class Base {def name:String} 
class Derived extends Base {def name:String = "Derived"} 
class Main[T <: Base] 
{ 
    trait SubBase extends Base { this: T => } 
    val x:SubBase; 
    println(x.name) 
} 
val m:Main[Derived] 

这将编译,但不是很有用,因为事实SubBase也是T保持私有SubBase

+0

Private T对我而言并不在意。但是我不能用这个SubBase和其他类来混合制作“钻石”结构。可能是不可能的。我会尝试阅读更多关于scala中自我类型的东西,谢谢你的这种方式。 – 2015-02-12 08:03:39