2014-12-30 2 views
2

У меня есть простой класс, который принимает общий тип, например:Scala. Проверка, если тип является Сопоставимым

class SomeClass[T: TypeTag](someVal: T) = { 
    def value = someVal 
    def columnType = typeOf[T] 
} 

мне нужно проверить, если [Т] Сопоставимый во время выполнения (я не хочу требовать, чтобы это сопоставим, проверяем, есть ли это или нет). Если у меня есть реальный экземпляр [T] (который я не), я могу сделать следующее, который работает отлично ...

def canCompareType[T](value: T): Boolean = { 
    val compClass = classOf[Comparable[_]] 
    compClass.isAssignableFrom(value.getClass) 
}  

Но я не могу работать, как сделать это с помощью только и фактически не имеет экземпляра [T]. Я попытался следующие мысли, что он выглядит и кажется разумным ...

def canCompareType[T]: Boolean = { 
    val compClass = classOf[Comparable[_]] 
    compClass.isAssignableFrom(classOf[T]) 
} 

Но выдает ошибку компиляции ...

Error: class type required but T found : compClass.isAssignableFrom(classOf[T]) 

Я нашел подобный ответ здесь, но он снова предполагает, что У меня есть экземпляр [T].

Cast objects to comparable type

Любые идеи, как я могу решить это. У меня такое чувство, что я должен быть довольно близко.

Update мне нужно, чтобы быть в состоянии проверить также на типы значений, поэтому я хотел бы canCompareType[Int] также возвращает истину, как 100.compareTo(200) действует.

Thanks

ответ

3

Что-то вроде этого возможно?

def foo[T: TypeTag] = typeOf[T] match { 
    case t if t <:< typeOf[Comparable[_]] => "Comparable" 
    case _ => "Not Comparable" 
} 
+0

К сожалению, это не относится к типам значений. Например, 'foo [Int]' будет возвращать false, тогда как сравнение поддерживается в экземпляре Int (или, по крайней мере, знает, как его сравнивать и разрешать внутри) – Moog

+1

Ну, примитивные типы не являются «сравнимыми», так что это понятно. Если вы хотите, чтобы он возвращал значение true для 'Comparable' * или * примитивного типа, тогда добавьте еще одно предложение case, где защита будет' if t <: Dima

+0

Это именно то, что мне нужно. Работает отлично. Благодаря! – Moog

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