2016-02-02 7 views
7

、なぜGroovyのメソッドbarManyに閉鎖パラメータの提供ジェネリック型宣言を無視しているように見えるん:閉鎖パラメータ - 次のコードで異常

import groovy.transform.CompileStatic 

@CompileStatic 
class Main { 
    static main(args) { 
     FooSub foo = new FooSub() 
     BarSub bar = new BarSub() 
    } 
} 

@CompileStatic 
class Foo<T> { 
    void fooOne (T item) {} 
    void fooMany(List<T> items) { 
     items.each { T item -> fooOne(item) } // Compiles fine. 
    } 
} 

@CompileStatic 
class FooSub extends Foo<Integer> {} 

@CompileStatic 
class Bar<T extends Bar<T>> {  
    void barOne (T item) {} 
    void barMany(List<T> items) { 

     items.each { T item -> barOne(item) } // Error: 
     // Cannot find matching method Bar#barOne(java.lang.Object) !!! 

     items.each { T item -> barOne(item as T) } // Error: 
     // Expected parameter of type java.lang.Object but got T !!! 

     items.each { item -> barOne(item as T) } // Compiles fine - closure knows about T 

    } 
    void barManyMore(List<T> items) { 
     for (T item in items) { // Compiles fine. 
      barOne(item) } 
    } 
} 

@CompileStatic 
class BarSub extends Bar<BarSub> {} 

更新: Groovyのバージョン: 2.4.5 JVM:1.7.0_80ベンダー:オラクル・コーポレーションのOS:Linuxの

更新 だから私は前に気づいていない、この奇妙なエラーが発生した - ORGは、 .codehaus.groovy.control.MultipleCompilationErrorsException:スタートアップを失敗しました - 私はフル出力を投稿します:

~/grov/tests$ groovyc generics.groovy 
org.codehaus.groovy.control.MultipleCompilationErrorsException: startup failed: 
generics.groovy: 27: Expected parameter of type java.lang.Object but got T 
@ line 27, column 19. 
     items.each { T item -> barOne(item) } // Error: 
        ^

generics.groovy: 27: [Static type checking] - Cannot find matching method Bar#barOne(java.lang.Object). Please check if the declared type is right and if the method exists. 
@ line 27, column 29. 
     items.each { T item -> barOne(item) } // Error: 
          ^

generics.groovy: 30: Expected parameter of type java.lang.Object but got T 
@ line 30, column 22. 
      items.each { T item -> barOne(item as T) } // Error: 
         ^

3 errors 

~/grov/tests$ groovyc -v 
Groovy compiler version 2.4.5 
Copyright 2003-2015 The Apache Software Foundation. http://groovy-lang.org/ 

更新

完全性についていくつかのより多くの回避策: これらの回避策が動作するように見える:

Closure c = { T item -> barOne(item) }; items.each c // See comments by @tim_yates 
    items.each ({ T item -> barOne(item) } as Closure) // Casting to closure works too! 

タイプがジェネリックTに基づくクラスの場合も同じ問題が発生します。

@CompileStatic 
class Baz<T extends Baz<T>> { 
    List<T> getList() { 
     return [new T(), new T()] 
    } 
} 

@CompileStatic 
class BazClient { 
    void useBaz(Baz baz) { 
     // baz.getList().each {Baz it -> println it} // Error 
     Closure c = {Baz it -> println it}; baz.getList().each c // works 
     baz.getList().each ({Baz it -> println it} as Closure) // works 
    } 
} 
+1

groovyのどのバージョンですか? –

+0

私はapologiesを更新しました。 –

+0

私はこのコードに問題はありません。IDEを再起動してみてください。なぜそれがエラーを言うのか分かりません。 – Fincio

答えて

0

これはGroovy 2.4.6で修正されたジェネリック関連のbugsの1つです。

関連する問題