Scala seq的Java自有界泛型

时间:2016-07-21 22:57:38

标签: java scala generics

我试图在scala中创建一堆子类的数组,问题是超类是一个自我限制的泛型,即(显然是为了容纳lombok所以这不是我可以改变的东西)

abstract public SomeClass<T extends SomeClass>{}

在Scala中

val subClasses:Seq[_ <: SomeClass] = seq(sub1, sub2, ..., subN)

我得到的错误&#34; SomeClass采用类型参数&#34;似乎表明我需要

Seq[_ <: SomeClass[_ <: SomeClass[_ <: SomeClass ...

经过相当多的谷歌搜索后,我仍然没有找到一个很好的解决方案,此时我不知道该搜索什么。非常感谢任何帮助。

1 个答案:

答案 0 :(得分:1)

自我引用类型在scala中称为F-bounded polymorphism。要创建您在示例中描述的Seq,类型将为:

>>> data = numpy.random.normal(loc = 0.0, scale = 1.0, size = 1000) 
>>> from sklearn.mixture import DPGMM
>>> d = DPGMM(n_components=5)
>>> d.fit(data.reshape(-1,1))
DPGMM(alpha=1.0, covariance_type='diag', init_params='wmc', min_covar=None,
   n_components=5, n_iter=10, params='wmc', random_state=None, thresh=None,
   tol=0.001, verbose=0)
>>> d.n_components
5
>>> d.means_
array([[-0.02283383],
       [ 0.06259168],
       [ 0.00390097],
       [ 0.02934676],
       [-0.05533165]])

请注意,此类型特定于其中的项目列表,您可以创建一个包含Seq[SomeClass[_ >: subN with sub2 with sub1 <: SomeClass[_ >: subN with sub2 with sub1 <: Object]]] 的所有子类型的类型,但这会让您感到痛苦。