2014-02-18 20 views
0

我使用階,並且具有一個殼體類定義爲映射元組的過濾列表給出了一個錯誤在階

case class caseClass(aString :String, bInt :Int, cClass : Class[_], dClass : Class[_], eClass : Class[_]) 

,然後我有代碼從類的列表得到一組M的

classes.filter(
    clazz => clazz.isInterface 
).map(
    klazz => (
     klazz.getDeclaringClass, 
     klazz, 
     klazz.getDeclaringClass.getDeclaredClasses.filter(
     klass => klass.getSimpleName.equals("PythonJ") 
    ).head 
    ) 
).zipWithIndex.map { case ((service, iteratr, privte), port) => caseClass(
    s.getName, port, service, iteratr, privte 
) 
}.toSet 

但是當我嘗試編譯這段代碼它提供了一個錯誤說

constructor of type (T1, T2, T3) cannot be uniquely instantiated to expected 
type Tuple3 [Class[?], Class[?], Class[?]] 

--- because --- 

undetermined type 

).zipWithIndex.map { case ((service, iteratr, privte), port) => caseClass(
          ^

有人能告訴我,我必須做的麥e這正確

+1

我可以理解你可能想向公衆隱藏你的一些邏輯,但是請你改進你的變量命名嗎?首先,它會傷害眼睛,其次,它會給我們更多的背景和閱讀的樂趣。謝謝 –

回答

1

的Aurelien Thieriot是正確的,你需要幫助的編譯器 - 而是在不同的地方:

classes.filter(
    clazz => clazz.isInterface 
).map(
    klazz => (
     klazz.getDeclaringClass, 
     klazz, 
     klazz.getDeclaringClass.getDeclaredClasses.filter(
     klass => klass.getSimpleName.equals("PythonJ") 
    ).head 
    ): (Class[_],Class[_],Class[_]) // <--type spec 
).zipWithIndex.map { case ((service, iteratr, privte), port) => caseClass(
    service.getName, port, service, iteratr, privte 
) 
}.toSet 

這將(在我的理解),通過固定的類型參數的幫助將map的結果轉換爲存在類型,這使得後續的類型推斷結果是明確的(即編譯器不會被迫推斷「Class什麼?」)。

0

我敢打賭,編譯器不能推斷出類型。

您是否試過指定您所期待的類型?喜歡的東西:

).zipWithIndex.map { case ((s: Class[_], i: Class[_], p: Class[_]), port) => Module(
+0

我試過了,但同樣的錯誤出現了。 – ddarz4u