Скажем, у меня есть специализированный класс и связанный с ним сопутствующий объект:Как проверить, что я внутри функции или класса @specialized во время выполнения в scala?
trait Slice[@specialized +T] {
...
override def equals(that :Any) = that match {
case s :Slice[_] => ???
case _ => false
}
}
object Slice {
def newInstance[@specialized T] = ???
}
Есть ли способ, чтобы проверить
- Внутри метода Slice, если этот экземпляр является специализированным подклассом,
- Внутри метода Slice, если другой экземпляр является специализированным подклассом для одного и того же примитива,
- Внутри специализированного метода на сопутствующем объекте, если я запускаю стираемый или специализированный вариант
не прибегая к ClassTags или передавая класс [_] вручную? Похоже, эта информация должна быть доступна, но единственный способ, который я могу представить, - проверить имена классов.
Вариант использования 2) особенно важен, так как я могу прибегнуть к более быстрым алгоритмам, если я новичок в сравнении яблок с яблоками. Вероятно, может быть выполненным путем отражения, но было бы довольно сложно, если учесть, что мы должны обрабатывать несинтетические подклассы Slice; если у нас есть также
trait ArraySlice[@specialized T] extends Slice[T] { ... }
, что следует считать «совместимым» с ломтиком [T] случаях до тех пор, как они оба специализированные (или оба стерты)?
Вы действительно хотите, чтобы проверить из функции? Любая проверка будет потреблять всю выгоду от специализации. Кроме того, что не так с проверкой имен классов 'x.getClass.getName.endsWith (" $ sp ")'? Я использую это в некоторых модульных тестах, чтобы убедиться, что специализация работает (но извне) –
Нет, если проверка и бросок выполняются в коллекции и исключают бокс, выполняемый в цикле. Проблема с проверкой суффикса класса nake заключается в том, что проверенный экземпляр может быть специализацией в виде субтракта, расширяя стертую версию этого признака. Добавьте вложенные классы, и такой код будет очень сложным, чтобы получить право, не говоря о хрупкой зависимости от схемы именования, используемой компилятором. – Turin