2014-12-26 5 views
1

Я хочу получить фактический тип класса из родового типа.Получить класс типа из общего в scala

Когда я пытаюсь это

я получаю только класс scala.runtime.Nothing.

+2

Два 'T' разные. Попробуйте: 'Car.something [String]()' например. –

+0

@ GáborBakos Ah .. HA! Благодаря!! – Notice

ответ

2

Вы могли бы хотеть что-то вроде следующего: 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 (когда я не спит :)).

+0

Это 1) не юридический синтаксис; 2) сложнее, чем требуется, если вы исправите синтаксис 'def something [U] (неявный ev: T =: = U, tag: ClassTag [U])'. –

+0

@AlexeyRomanov Спасибо, обновлены и +1 к вашему решению. –

2
class Model[T:ClassTag] { 

    def something():Unit = { 
    println(classTag[T].runtimeClass) 
    } 

} 

Я решил, изменив модельный признак на класс и предоставив ClassTag Generic.

1

Если вы хотите разрешить создавая Model без ClassTag и требуют только ClassTag для некоторых методов, вы можете сделать

trait Model[T] { 
    def something(implicit tag: ClassTag[T]):Unit = ... 
} 

Очевидно, что это относится и к, например, Numeric, Ordering, и т.п. ограничение также.

Смежные вопросы