scala – 多重集合的高级类型
发布时间:2020-12-16 09:59:53 所属栏目:安全 来源:网络整理
导读:我想在 Scala中编写一个Multiset [T,S [_]]类,它有两个类型参数:T是元素的类型,而S是集合的底层表示. 在这个多集中,构造了一个S [(T,Int)]的实例(在每对中,T是元素,Int是它的出现次数). 这在C中是可能的: templatetypename T,templatetypename S 两个问题
我想在
Scala中编写一个Multiset [T,S [_]]类,它有两个类型参数:T是元素的类型,而S是集合的底层表示.
在这个多集中,构造了一个S [(T,Int)]的实例(在每对中,T是元素,Int是它的出现次数). 这在C中是可能的: template<typename T,template<typename> S> 两个问题: >如何在S上声明它必须是一个集合的约束? Multiset [T,S [_]<:Set [_]]是否有效? 解决方法
第一个问题:使用S [X]<:设置[X]代替.使用下划线标记高阶类型参数是方便的,不需要用无用的名称来引起注意,但实际上你可以使用任何标识符.对于这种特殊情况,下划线不起作用.你甚至可以做S [X]<:Set [List [X]]之类的事情. 第二个问题:没有直接的等价物,但我很少在C#中使用它,因为它暗示对象只能由无参数构造函数创建,这是一个很大的限制,对所有可能的代码使用都有效.例如,您的类的用户可能希望在初始化时设置容量,或者使用池或其他任何东西.大多数时候,我需要一个Func< S>.在构造函数中委托,我可以添加一个静态工厂,它接受new作为方便
class Generic<T> { public Generic(...,Func<T> factory) } static class Generic { public Generic<T> Create(....) where T : new { return new Generic(...,() => new T()); } } 在scala中,您需要传递该函数.一种可能的替代方案是使用隐含参数,例如 trait Builder[A] { def build(): A } object Builder { def build[A: Builder] : A = implicitly[Builder[A]].build() } class Generic[A: Builder](....) {.... ... // instead of val a = new A() val a = Builder.build[A] .... } 然后,您可以确保构建器在参数类型的隐式作用域中可用,并且默认情况下将使用它.当默认值不是你想要的时候,你仍然可以明确地传递另一个. (编辑:李大同) 【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容! |