Я пытаюсь понять участников типа в Scala. Я записал простой пример, который пытается объяснить мой вопрос.
Во-первых, я создал два класса для типов:
class BaseclassForTypes
class OwnType extends BaseclassForTypes
Затем я определил участника абстрактного типа в черте и затем определил участника типа в 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
Так, есть ли лучший способ сделать это, или участники типа предназначены, чтобы использоваться только с внутренней реализацией класса?
Вы можете использовать ScalaTypesTestImpl # T
вместо typeTest.T
или
val typeTest:ScalaTypesTest = new ScalaTypesTestImpl
val typeObject:ScalaTypesTest#T = typeTest.returnType
Если вы не хотите использовать экземпляр ScalaTypesTestImpl
, то, возможно, вам лучше поместить T
в объект
вместо ] класс
. Для каждого экземпляра x
из ScalaTypesTestImpl
, x.T
является другим типом. Или, другими словами, если у вас есть два экземпляра x
и y
, то x.T
не того же типа, что и y.T
.