我正在尝试了解Scala中的类型成员。我写了一个简单的例子,试图解释我的问题。
首先,我为类型创建了两个类:
class BaseclassForTypes
class OwnType extends BaseclassForTypes
然后,我在trait中定义了一个抽象类型成员,然后在一个concerete类中定义了类型成员:
trait ScalaTypesTest {
type T <: BaseclassForTypes
def returnType: T
}
class ScalaTypesTestImpl extends ScalaTypesTest {
type T = OwnType
override def returnType: T = {
new T
}
}
然后,我想访问类型成员(是的,这里不需要类型,但这解释了我的问题)。这两个例子都有效。
解决方案1.声明类型,但问题是它不使用类型成员并且类型信息是重复的(调用者和被调用者)。
val typeTest = new ScalaTypesTestImpl
val typeObject:OwnType = typeTest.returnType // declare the type second time here
true must beTrue
解决方案2.初始化类并通过对象使用类型。我不喜欢这个,因为这个类需要初始化
val typeTest = new ScalaTypesTestImpl
val typeObject:typeTest.T = typeTest.returnType // through an instance
true must beTrue
那么,是否有更好的方法可以做到这一点,或者类型成员是否只用于类的内部实现?
答案 0 :(得分:7)
您可以使用ScalaTypesTestImpl#T
代替typeTest.T
或
val typeTest:ScalaTypesTest = new ScalaTypesTestImpl
val typeObject:ScalaTypesTest#T = typeTest.returnType
答案 1 :(得分:3)
如果您不想实例ScalaTypesTestImpl
,那么,或许最好将T
放在object
而不是class
上。对于x
的每个实例ScalaTypesTestImpl
,x.T
是不同的类型。或者,换句话说,如果您有两个实例x
和y
,则x.T
与y.T
的类型不同。