2015-02-03 8 views
1

В Java Я пытаюсь использовать тип, определенный в Scala, но я получаю ошибки типа «несоответствие типа». Я предполагаю, что это из-за стирания типа Java, но есть ли способ обойти это?Использовать типы Scala в Java (несоответствие типов)

В Scala у меня есть этот тип

Type[T] 

и класс действия, который использует этот тип, чтобы определить его тип значения, чтобы гарантировать значение имеет определенного типа.

class Action[T](tpe: Type[T], value: T) 

Теперь, когда есть что-то вроде BooleanType, действие только допускает true для ложных значений.

case object BooleanType extends Type[Boolean] 
new Action(BooleanType, true) // ok 
new Action(BooleanType, 1) // compile error 

Мы хотели бы иметь возможность использовать это на Java. В Java я мог бы определить тип либо как класс

class TimestampType implements Type[Long] 

или перечисление иметь одноплодный вроде «случая объекта, в Scala

enum LongType implements Type[Long] { LongType; } 

Но когда я теперь пытаюсь использовать их в Действие

new Action(new TimestampType, 1L) 
new Action(LongType.LongType, 1L) 

оба утверждения дают ошибку компиляции

:12: error: type mismatch; found : TimestampType required: Type[Any] Note: Long <: Any (and TimestampType <: Type[Long]), but trait Type is invariant in type T. You may wish to define T as +T instead. (SLS 4.5) new Action(new TimestampType, 1L)

Причина, вероятно, связана с типом стирания класса Java. Я играл с использованием дисперсии + T и -T, но это не дает возможности, которые я хочу или не компилирую. Я также попытался использовать [T : ClassTag] для класса Action, но это не решает проблему.

Есть ли способ иметь Java-реализации типов Scala? Есть ли лучший способ попытаться применить тип значения, разрешен или совместим с определенным типом?

ответ

3

Проблема в том, что вы указали неправильный type.You объявили как:

class TimestampType implements Type[java.lang.Long] 

, но вместо этого в Скале, вы new Action(new TimestampType, 1L:scala.Long). java.lang.Long отличается от scala.Long. Отсюда ошибка.

следующих работ: В Java:

public class IntTyp implements Typ<scala.Int> {} 

В Скале,

val b = new Action[Int](new IntTyp, 1) 

или наоборот:

public class LongTyp implements Typ<Long> {} 
val c = new Action[java.lang.Long](new LongTyp, 1L) 
+0

'scala.Int' не могут быть использованы из Java, поскольку на самом деле это не тип JVM. –

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