Доступ к членам типа вне класса в Scala - PullRequest
7 голосов
/ 23 марта 2010

Я пытаюсь понять членов типа в Scala. Я написал простой пример, который пытается объяснить мой вопрос.

Сначала я создал два класса для типов:

class BaseclassForTypes
class OwnType extends BaseclassForTypes

Затем я определил абстрактный член типа в trait, а затем определил член типа в конкретном классе:

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

Итак, есть ли лучший способ сделать это или члены типа должны использоваться только с внутренней реализацией класса?

Ответы [ 2 ]

7 голосов
/ 23 марта 2010

Вы можете использовать ScalaTypesTestImpl#T вместо typeTest.T или

val typeTest:ScalaTypesTest = new ScalaTypesTestImpl
val typeObject:ScalaTypesTest#T = typeTest.returnType
3 голосов
/ 24 марта 2010

Если вы не хотите копировать ScalaTypesTestImpl, то, возможно, вам лучше поставить T на object вместо class. Для каждого экземпляра x из ScalaTypesTestImpl, x.T - это другой тип. Или, другими словами, если у вас есть два экземпляра x и y, то x.T отличается от типа y.T.

...