2016-04-02 16 views
3
class TestClass <T extends SuperClass>{ 
public List<T> doSmth(){ 
    ///.... 
    List testObjects = [] 
    testObjects.add(new T(arg)) 
    return testObjects; 
} 
} 

class SuperClass{ 

} 
class A extends SuperClass{ 
A(Arg arg){ 
    .... 
} 
class B extends SuperClass{ 
B(Arg arg){ 
    .... 
} 

////////test 
class Main{ 
List <A> a 
List <B> b 

Main(){ 
    this.a = new TestClass<A>().doSmth() 
    this.b = new TestClass<B>().doSmth() 
} 
} 

た例外(groovy.lang.GroovyRuntimeException:スーパークラスのためのマッチングコンストラクタが見つかりませんでした)ライン上のGroovyのジェネリック医薬品の問題

testObjects.add(new T(arg)) 

スーパークラスがコンストラクタを持っていませんだってこれは非常に正確です。しかし、サブクラスは1つとすべてが同じシグネチャを持ち、argは同じタイプです。

いくつかのいずれかは、私の問題への解決策を見つけるために私を助けることができますか?

+0

コンストラクタでは、AクラスとBクラスの両方で同じ型の引数が使用されます。 –

答えて

3

残念ながら、それはnew Tでジェネリック型の新しいインスタンスを作成することはできません。だからあなたはその問題を回避する必要があります。それを回避するために

一つの方法は、あなたのためのインスタンスを作成しますdoSmth()で閉鎖パラメータを含めることです。

public List<T> doSmth(Closure newT) { 
    List testObjects = [] 
    testObjects.add(newT(arg)) 
    return testObjects; 
} 

とメソッドを呼び出すときに、新しいインスタンスを作成するためのコードを提供します。

Main() { 
    this.a = new TestClass<A>().doSmth { new A(it) } 
    this.b = new TestClass<B>().doSmth { new B(it) } 
} 
2

あなたのコードがABのコンストラクタに一致していない動作しない理由。理由は、SuperClassの文字列を受け入れるコンストラクタがないためです。
new T()は期待どおりに動作しません。あなたのコードではnew SuperClass(arg)になります。次のコードは、

class TestClass <T extends SuperClass> { 
    public void doSmth(){ 
     println new T().class.simpleName; 
    } 
} 

class SuperClass{} 
class A extends SuperClass{} 
class B extends SuperClass{} 

new TestClass<A>().doSmth() 
new TestClass<B>().doSmth() 
new TestClass<String>().doSmth() //even this works 

それを証明する出力は

SuperClass 
SuperClass 
SuperClass 

TestClass <T>Objectを印刷しますです。 TestClass <T extends A>Aなどを印刷します。

実行時にGroovyに汎用タイプの情報がありません。 Groovyはコンパイル・タイプ・チェックも行いません(例:new TestClass<String>())。しかし、それはnew T()を働かせるためにいくつかの情報を保持します。

Javaのジェネリックス実装では、静的型検査を完了した後にジェネリック型情報を「スローアウェイ」する「型消去」と呼ばれる機能が組み込まれています。これにより、Javaは従来の「非ジェネリック」ライブラリと簡単に統合できます。 Groovyは現在、もう少しして、 "ソースレベルで"ジェネリックの情報を放棄しています。ジェネリックス情報は適切な署名内に保持されます。http://web.archive.org/web/20150102195947/http://groovy.codehaus.org/Generics

関連する問題