В дополнение к тому, что было сказано до возврата Вашего кода ошибки, исчерпывают утверждение или подобную диагностику, когда ошибка возвращается, поскольку это сделает трассировку намного легче. Путем я делаю это должно иметь специализированное, утверждают, что все еще компилируется в при выпуске, но только запущен, когда программное обеспечение находится в режиме диагностики с опцией тихо сообщить файлу журнала или паузе на экране.
я лично возвращаю коды ошибок как отрицательные целые числа с no_error как нуль, но он действительно оставляет Вас с возможной следующей ошибкой
if (MyFunc())
DoSomething();
, альтернатива, возвратили отказ всегда как нуль и используют LastError () функция для предоставления подробной информации фактической ошибки.
РЕДАКТИРОВАТЬ - извинения, я только что заметил вашу первую ошибку . Невозможно создать экземпляр 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)
Как уже упоминалось, вы не можете создать экземпляр T
из-за стирания. Во время выполнения нет T
. Это не похоже на шаблоны C ++, в которых подстановка происходит во время компиляции, а несколько классов фактически компилируются для каждого варианта фактического использования.
Решение манифеста интересно, но предполагает наличие конструктора для T
, не требующий параметров. Вы не можете этого предполагать.
Что касается второй проблемы, метод mailboxSize
защищен, поэтому вы не можете вызвать его для другого объекта. Обновление: это верно только для Scala 2.8.
Использовать манифест:
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 каждую ночь.