【发布时间】:2016-02-01 11:28:33
【问题描述】:
我在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] 不符合 trait IProperty 的类型参数边界 [T <: comparable>
最后我想出了一个办法,但对我来说它看起来很丑:
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#Value 与 Comparable[T] 不匹配,因为 Value extends Ordered[Value] 扩展了 Comparable[Value]?
【问题讨论】:
-
为什么不
class EnumerationProperty1[T <: Enumeration](val enum: T, val name: String) extends IProperty[T]。我不明白它是如何不足的。