У меня есть следующий интерфейс в JavaПочему я не могу реализовать этот интерфейс Java в Scala без уродливых анонимных классов
public interface IProperty<T extends Comparable<T>> {
String getName();
Collection<T> getAllowedValues();
Class<T> getValueClass();
String getName(T value);
}
и пытается осуществить его в Скале, но не может заставить его работать
Первая попытка:
class EnumerationProperty1[T <: Enumeration](val enum: T, val name: String) extends IProperty[enum.Value] {
override def getName = name
override def getValueClass = classOf[enum.Value]
override def getName(value: enum.Value): String = value.toString
override def getAllowedValues: java.util.Collection[enum.Value] = enum.values.toList
}
не компилируется с ошибкой: не найдено: значение перечисления
Вторая попытка:
class EnumerationProperty2[T <: Enumeration](val enum: T, val name: String) extends IProperty[T#Value] {
override def getName = name
override def getValueClass = classOf[T#Value]
override def getName(value: T#Value): String = value.toString
override def getAllowedValues: java.util.Collection[T#Value] = enum.values.toList
}
Не компилировать с Error: аргументы типа [T # значение] не соответствуют Черта границ параметров типа IProperty в [T <: Сопоставимые [T]]
Наконец я придумал, как сделать это, но это выглядит довольно некрасиво мне:
object EnumerationPropertyAnonymous {
def create[T <: Enumeration](enum: T, name: String) = {
new IProperty[enum.Value] {
override def getName = name
override def getValueClass = classOf[enum.Value]
override def getName(value: enum.Value): String = value.toString
override def getAllowedValues: java.util.Collection[enum.Value] = enum.values.toList
}
}
}
Вопросы:
- Что такое правильный способ сделать это?
- Почему enum.Value не работает с моей первой попытки, но работает, когда используется в анонимном классе?
- Почему переменная enum.Value и T # не совпадают?
- Почему компилятор жалуется на T # Значение не соответствует Comparable [T], так как Value расширяет упорядоченное [Value], которое расширяет Comparable [Value]?
Почему бы не 'class EnumerationProperty1 [T <: Enumeration] (val enum: T, val name: String) extends IProperty [T] '. Я не вижу, как он падает. – Jatin