2013-04-20 77 views
2

混合复杂的Java泛型集合工作在我公司工作,因为我们从可以概括为(Java)的模式得到了许多好处如下:在斯卡拉2.10

有“东西”,我们可以得到由他们的特殊/聪明的“ids”。每个“事物”都知道它的ID,而IDS是“聪明的”,因为你可以让他们给你所识别的“事物”。在复杂的不断增长的“事物”层次上,这可以简化维护过程并消除大量代码(重复或其他)。我相信你们中的一些人可能会觉得这很奇怪,我可以解释为什么会出现这种情况,但事实是,它是这样,迄今为止有帮助,而不是问题的一部分。的这个Java定义

摘要如下(略有改写):

interface Id<I extends Id<I,T>, T extends Thing<I,T>> { 
    T getThing(); 
    ... 
} 

interface Thing<I extends Id<I,T>, T extends Thing<I,T>> { 
    public I getId(); 
    ... 
} 

有时候,我们需要得到一个给定了一批不同的ID(这正好跨网络的事情“批”,因此分批加速)。对于本说明书的目的,可以写成:

public Map<Id<?,?>,Thing<?,?>> getManyThings(List<Id<?,?>> idsToGetThingsFor); 

(方法参数仅仅是ID的多样性,它真的不要紧,无论它是一个集合,列表或其他方式)

现在,在网络的另一端,这种方法在Scala 2.9中实现,相当丑陋的避免了Scala泛型的严格性。我们正在尝试升级到Scala 2.10,并且事情不再编译,必须找出解决方法。诀窍是,有一种方法斯卡拉总结如下:

def getOneThing[I <: Id[I,T],T <: Thing[I,T]](id: I): T; 

这种方法去和检查,处理和分发适当基于许多因素的呼吁 - 太多在这里解释并不相干。

现在,getManyThings()方法遍历传递给它的id并需要将它们作为参数传递给getOneThing()。那是事情失败的地方。 getManyThings()只知道它获得的id基本上是Id,并且Scala抱怨[,]对于[I,T],[<] ]]认为getOneThing()要求:

... error: inferred type arguments [Id[_$16,_$17],Nothing] do not conform to method getOneThing's type parameter bounds [I <: Id[I,T],T <: Thing[I,T]] 

注 - 声明的标识和东西非参数(非通用)基类并不能真正帮助,因为它只是推动问题(太多)等景点。我们选择了非常严格的类型以确保代码质量,但是我们必须有一种方法来处理“混合”集合。

任何帮助?请!

回答

2

我假设你有一个方法是这样的:

def getManyThings[I <: Id[I, T], T <: Thing[I, T]](ids:List[I]):List[T] = 
    ids map getOneThing 

这会给一个错误,因为编译器不能推断出要与T调用getOneThing方法作为第二个类型参数。

为了“帮助”你需要明确地传递他们的编译器:

trait Id[I <: Id[I, T], T <: Thing[I, T]] 
trait Thing[I <: Id[I, T], T <: Thing[I, T]] 

def getOneThing[I <: Id[I, T], T <: Thing[I, T]](id:I):T = ??? 

def getManyThings[I <: Id[I, T], T <: Thing[I, T]](ids:List[I]):List[T] = 
    ids map (getOneThing[I, T](_)) 
+0

谢谢!我们只是没有想到即使这样做,因为这是过去的问题(实际的代码“稍微”更复杂)。它工作在2.10,虽然(和杜!)! – Oopsilon 2013-04-21 18:53:06