2017-08-12 12 views
1

私はGroovyで何かを学んでいる半Javaです。テンプレートパラメータとしてのJavaベース

はGroovyの/ Javaで、次のことが可能です:

public class A { 
} 
public class B { 
} 

public class C<Ta extends A, Tb extends B> extends Ta { 
    public Ta[] bArray; 
    public Tb[] getAllBs() 
    { 
     Tb[] ret = new Tb[0]; 
     .... 
     return ret; 
    } 
} 

上記の定義は、すべてのエラーを示してはいけません。私は別のタイプのための基本クラスとしてCを使用しようとする。しかし、私はエラーを取得する:定義上

public class DummyA extends A {}; 
public class DummyB extends B {}; 

public class D extends C<DummyA, DummyB> { 
} 

がエラー「タイプDの階層矛盾している」を示しています。

私は、次のいずれかのように、Cを再定義する場合は、エラーが消える:

//remove the base class, Ta, from C 
public class C<Ta extends A, Tb extends B> { 
.... 
} 

(または)

//Use the class A, instead of generic type Ta, as base class 
public class C<Ta extends A, Tb extends B> extends A { 
.... 
} 

私はいくつかのJavaのルールを破ったが、

を識別することができませんでしなければなりません
+0

私の場合、 'Tb [] ret = new Tb [0];'というメッセージで 'Tbのジェネリック配列を作成できません' – ByeBye

答えて

0

Dのスーパークラスのスーパークラスが「汎用」であるため不可能です。
一般的なスーパータイプは許可されていません。これは許可されています

public class C<B extends WhatElse> extends ArrayList<B>{ 

スーパークラスは、パッケージjava.langに明確であり、あなたが唯一のスーパークラスをあなたの「独自の」一般的なパラメータを与えるので。
javaには、クラスをコンパイルする明確な構造が必要です。 例:どのメソッドを上書きできますか?

0

そして、この行のいくつかの情報:Tb[] ret = new Tb[0];は決して動作しません!
new Tb();も使用できない汎用配列を生成することはできません!

関連する問題