У меня есть следующий интерфейс на Java
public interface IProperty<T extends Comparable<T>> {
String getName();
Collection<T> getAllowedValues();
Class<T> getValueClass();
String getName(T value);
}
И пытаюсь реализовать его в scala, но не могу заставить его работать
Первая попытка:
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
}
Не компилируется с ошибкой: аргументы типа [T # Value] не соответствуют границам параметра типа свойства IProperty [T ‹: Comparable [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 # Value не совпадают?
- Почему компилятор жалуется на то, что значение T # не совпадает с Comparable [T], поскольку Value расширяет Ordered [Value], которое расширяет Comparable [Value]?
class EnumerationProperty1[T <: Enumeration](val enum: T, val name: String) extends IProperty[T]
. Я не понимаю, почему это не так. - person Jatin   schedule 01.02.2016