在下面的代碼中,當我直接從散列表中獲得屬性的正確類型(PropertyA
)時。如何代理對hashmap的調用而不會丟失類型
當我代理這個呼叫通過get方法ClassAbstract
類型爲PropertyAbstract[_ <: A]
有沒有辦法來代理調用HashMap和保持正確的類型?
另一個問題是如何通過類型檢查將對象添加到revs
數組?
class A
class B extends A
class C extends A
abstract class PropertyAbstract[T] {
val revs = new java.util.ArrayList[T]
}
class PropertyA extends PropertyAbstract[B]
class PropertyB extends PropertyAbstract[C]
abstract class ClassAbstract {
val props: scala.collection.immutable.HashMap[String, PropertyAbstract[_ <: A]]
def get(prop: String) = props.get(prop).get
}
class Class extends ClassAbstract {
val props = collection.immutable.HashMap(
"prop1" -> new PropertyA,
"prop2" -> new PropertyB
)
}
object Test extends App {
val the_class = new Class
val proxied_prop = the_class.get("prop1")
val direct_prop = the_class.props.get("prop1").get
// wont compile (found: B required: _$1 <: A)
proxied_prop.revs.add(new B)
// wont compile (found: B required: C with B)
direct_prop.revs.add(new B)
}
的通緝的結果是,我可以B
類型的一個元素添加到PROP1,而不是類型的元素C
對於'the_correct_type_prop',我得到'PropertyAbstract [_>:C with B <:A]'。如果您查看'the_class.props'的類型,這是預期的。 – 2012-02-02 11:48:30
我也認爲這是正確的。但是有沒有辦法在'PropertyA'的'revs'數組中添加'B'類型的對象(並且在嘗試添加'C'時出錯)?我認爲我使用的數據結構不允許這樣做。 – roelio 2012-02-02 11:59:41