Как инстанцировать экземпляра типа, представленного параметром типа в Scala

В дополнение к тому, что было сказано до возврата Вашего кода ошибки, исчерпывают утверждение или подобную диагностику, когда ошибка возвращается, поскольку это сделает трассировку намного легче. Путем я делаю это должно иметь специализированное, утверждают, что все еще компилируется в при выпуске, но только запущен, когда программное обеспечение находится в режиме диагностики с опцией тихо сообщить файлу журнала или паузе на экране.

я лично возвращаю коды ошибок как отрицательные целые числа с no_error как нуль, но он действительно оставляет Вас с возможной следующей ошибкой

if (MyFunc())
 DoSomething();

, альтернатива, возвратили отказ всегда как нуль и используют LastError () функция для предоставления подробной информации фактической ошибки.

34
задан Qantas 94 Heavy 1 May 2014 в 09:09
поделиться

3 ответа

РЕДАКТИРОВАТЬ - извинения, я только что заметил вашу первую ошибку . Невозможно создать экземпляр T во время выполнения, потому что информация о типе теряется при компиляции вашей программы (с помощью стирания типа )

Вам придется передать какой-то factory для достичь конструкции:

class BalanceActor[T <: Actor](val fac: () => T) extends Actor {
  val workers: Int = 10

  private lazy val actors = new Array[T](workers)

  override def start() = {
    for (i <- 0 to (workers - 1)) {
      actors(i) = fac() //use the factory method to instantiate a T
      actors(i).start
    }
    super.start()
  }
} 

Это может быть использовано с некоторым актером CalcActor следующим образом:

val ba = new BalanceActor[CalcActor]( { () => new CalcActor } )
ba.start

В качестве отступления: вы можете использовать до вместо до :

val size = 10
0 until size //is equivalent to:
0 to (size -1)
25
ответ дан 27 November 2019 в 16:55
поделиться

Как уже упоминалось, вы не можете создать экземпляр T из-за стирания. Во время выполнения нет T . Это не похоже на шаблоны C ++, в которых подстановка происходит во время компиляции, а несколько классов фактически компилируются для каждого варианта фактического использования.

Решение манифеста интересно, но предполагает наличие конструктора для T , не требующий параметров. Вы не можете этого предполагать.

Что касается второй проблемы, метод mailboxSize защищен, поэтому вы не можете вызвать его для другого объекта. Обновление: это верно только для Scala 2.8.

2
ответ дан 27 November 2019 в 16:55
поделиться

Использовать манифест:

class Foo[A](a: A)(implicit m: scala.reflect.Manifest[A]) {
  def create: A = m.erasure.newInstance.asInstanceOf[A]
}

class Bar

var bar1 = new Bar       // prints "bar1: Bar = Bar@321ea24" in console
val foo = new Foo[Bar](bar1)
val bar2 = foo.create    // prints "bar2: Bar = Bar@6ef7cbcc" in console
bar2.isInstanceOf[Bar]   // prints "Boolean = true" in console

Кстати, манифест недокументирован в 2.7.X, поэтому используйте его с осторожностью. Тот же код работает и в 2.8.0 каждую ночь.

15
ответ дан 27 November 2019 в 16:55
поделиться
Другие вопросы по тегам:

Похожие вопросы: