В 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? Есть ли лучший способ попытаться применить тип значения, разрешен или совместим с определенным типом?
'scala.Int' не могут быть использованы из Java, поскольку на самом деле это не тип JVM. –