Что такое Скала для объявления "Класса"" - PullRequest
2 голосов
/ 21 июня 2010

Я явно что-то упускаю из-за того, что следующее не компилируется:

trait SomeTrait{
def homepageClass[A <: SomeType]: Class[A]
}

class SomeOtherType extends SomeType

object SomeObject extends SomeTrait{
def homepageClass = classOf[SomeOtherType]
}

Ответы [ 2 ]

11 голосов
/ 21 июня 2010

Проблема здесь в том, что следующие два объявления отличаются:

def homepageClass[A <: SomeType]: Class[A]  // has type parameters
def homepageClass = classOf[SomeOtherType]  // doesn't have type parameters

Чтобы выполнить то, что вы хотите, вам нужно объявить абстрактный тип, например:

trait SomeTrait{
  type A <: SomeType
  def homepageClass: Class[A]
}

object SomeObject extends SomeTrait {
  type A = SomeOtherType
  def homepageClass: Class[A] = classOf[SomeOtherType]
}

Или

trait SomeTrait[A <: SomeType] {
  def homepageClass: Class[A]
}


object SomeObject extends SomeTrait[SomeOtherType] {
  def homepageClass: Class[SomeOtherType] = classOf[SomeOtherType]
}
2 голосов
/ 21 июня 2010
def homepageClass[A <: SomeType]: Class[A]

говорит: «какой бы подкласс A из SomeType вы ни дали, я могу вернуть Class[A]. В частности, его можно назвать так:

class SomeThirdType extends SomeType

val x: Class[SomeThirdType] = SomeObject.homepageClass[SomeThirdType]

Более прямоеэквивалент, который дает Даниил, - это экзистенциальный тип:

trait SomeTrait{
  def homepageClass: Class[A forSome {type A <: SomeType}] 
}

или

trait SomeTrait{
  def homepageClass: Class[_ <: SomeType] 
}

ОБНОВЛЕНИЕ: Два различия между решениями, о которых я могу думать:

  1. Экзистенциальные типы генерируют тот же байт-код, что и символы подстановки Java (и их основное предназначение - взаимодействие с подстановочными знаками ).

  2. Вы можете написатьТип уточнения для решения члена абстрактного типа:

     val x: SomeTrait {type A = SomeOtherType} = SomeObject
    

    Я не думаю, что вы можете для экзистенциальных типов.

Любые другие?

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...