Я хочу получить фактический тип класса из родового типа.Получить класс типа из общего в scala
Когда я пытаюсь это
я получаю только класс scala.runtime.Nothing
.
Я хочу получить фактический тип класса из родового типа.Получить класс типа из общего в scala
Когда я пытаюсь это
я получаю только класс scala.runtime.Nothing
.
Вы могли бы хотеть что-то вроде следующего: T=:=U
бы unify the two types и :ClassTag
бы просто создать ClassTag
для него.
Edit: правильная, но все еще слишком сложная форма:
trait Model[T] {
def something[U](implicit ev: T =:= U, tag: ClassTag[U]): Unit = {
println(tag.runtimeClass)
}
В общем, я бы также использовать https://stackoverflow.com/a/27666845/1502148 (когда я не спит :)).
Это 1) не юридический синтаксис; 2) сложнее, чем требуется, если вы исправите синтаксис 'def something [U] (неявный ev: T =: = U, tag: ClassTag [U])'. –
@AlexeyRomanov Спасибо, обновлены и +1 к вашему решению. –
class Model[T:ClassTag] {
def something():Unit = {
println(classTag[T].runtimeClass)
}
}
Я решил, изменив модельный признак на класс и предоставив ClassTag Generic.
Если вы хотите разрешить создавая Model
без ClassTag
и требуют только ClassTag
для некоторых методов, вы можете сделать
trait Model[T] {
def something(implicit tag: ClassTag[T]):Unit = ...
}
Очевидно, что это относится и к, например, Numeric
, Ordering
, и т.п. ограничение также.
Два 'T' разные. Попробуйте: 'Car.something [String]()' например. –
@ GáborBakos Ah .. HA! Благодаря!! – Notice