![](/img/trans.png)
[英]Mixing Scala and Java: How to get generically typed constructor parameter right?
[英]Generically typed classes in collections in Scala
我在使用Scala创建的泛型类时遇到问题。 我有以下课程:
class Channel[T, U](val endPoint : EventSource[U], val filter : Occurrence[T] => Boolean,
val map : Occurrence[T] => Occurrence[U]) {
def send(occurrence : Occurrence[T]) {
if (filter(occurrence)) {
endPoint.occur(map(occurrence))
}
}
}
这里,Channel [T,U]可以看作是将事件[T]从EventSource [T]传播到EventSource [U]的一种方式。 仅当过滤器函数为真时才发送该事件,如果是,则将该事件传递给map并发送该结果。
这个类似乎编译和正常运行。 我的问题是我想将几个Channel附加到EventSource [T]实例,因此它可以将Occurrences传播到几个不同类型的不同EventSource。 我的困惑基本上是如何做到这一点:
class EventSource[T] {
var List[Channel[T,U]] list = ...
}
你在这是什么? T简单地从list
所属的EventSource中的类型T引用(是其成员)。
对不起,如果这是一个模糊或混乱!
编辑:我应该注意到我也希望能够在以下列表中附加到此列表:
list = list ++ List[Channel[T, U](new Channel[T, U](endPoint, filter, map))
是追加真正的问题吗?
如果我正确理解您的问题,您可以使用Any:
class EventSource[T] {
val list: List[Channel[T, Any]] = ...
编辑:您的代码示例是使用append复制的吗? 因为我注意到你错过了Channel的类型。 此外,如果您只想在列表中添加一个元素,则可以使用cons,它会在列表的开头添加新元素:
Channel[Your, Types](your, para, meters)::list
如果由于某种原因绝对想要将新元素添加到该列表的末尾 ,则可以使用:+
。
要保持打字,你真的需要使用通配符_类型 。 这允许您以这样的方式定义列表,即在将列表添加到列表时关注Channel类型的U参数,而不是在将事件发送到列表中的所有通道时。 以下编译,但现在它是相当圆形的。 你需要一个子类的通道,除了将它发送到另一个EventSource之外。
class Occurrence[T]
class Channel[T, U](val endPoint : EventSource[U], val filter : Occurrence[T] => Boolean,
val map : Occurrence[T] => Occurrence[U]) {
def send(occurrence : Occurrence[T]) {
if (filter(occurrence))
endPoint.occur(map(occurrence))
}
}
class EventSource[T] {
var list: List[Channel[T,_]] = Nil
def addChannel[U]( endPoint : EventSource[U], filter : Occurrence[T] => Boolean, map : Occurrence[T] => Occurrence[U]) {
list = list ++ List[Channel[T, U]](new Channel[T, U](endPoint, filter, map))
}
def occur( occurrence : Occurrence[T] ) {
list foreach { _.send( occurrence ) }
}
}
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.