3

エラーが発生しましたが、プログラムにこの構造があります

public interface Shapes<T>{
//methods here
}

public class ShapeAction<T> implements Shapes<T>{
//Methods and implementations here
}

public class Circle extends ShapeAction<T>{
//Some methods here
}

エラーは、「Tを型に解決できません」というクラスCircle extendsShapes< T >を指していることです。Tを文字列に設定すると、エラーはなくなりますが、それは1つのデータ型しか使用できないことも意味します。任意のデータ型(String、int、doubleなど)を使用できるように<>内に何を入れる必要がありますか、またはこれを間違った方法で行いましたか?

4

3 に答える 3

6

2つの異なる概念があります。あなたが書くとき

public class ShapeAction<T>

これは、インスタンス化されると、いくつかのクラスでパラメーター化されるクラスを作成していることを意味します。いつになるかわからないので、と同じように参照しますT

しかし、あなたが書くとき

public class Circle extends ShapeAction<T>

これは、タイプがパラメータ化されCircleたサブクラスになりたいことを意味します。しかし、何ですか?コンパイラはそれを知ることができません:あなたは型変数なしで宣言しました。ShapeActionTTCircle

2つのオプションがあります。Circleを汎用にすることもできます。

public class Circle<T> extends ShapeAction<T>

このようにして、新しいインスタンスを作成するときに、Circleそれが機能するタイプを指定します。これは、スーパークラスに拡張されます。

また、ShapeActionを任意のタイプにすることができるが、サブクラスを汎用にすることなく指定したい場合はどうでしょうか。使用Object

public class Circle extends ShapeAction<Object>

この方法Circleはジェネリックではありませんが、スーパークラスで任意のデータ型を使用できます。

于 2012-07-25T17:38:27.200 に答える
4

これを試しましたか?

public class Circle<T> extends ShapeAction<T>{
//Some methods here
}

最初に引数を定義しない限り、コンパイラがT引数の意味を判断する方法はありません。extends ShapeAction<T>

最終的に、への参照を使用する場合はCircle、の型引数を指定する必要がありますT。これは、この型の他のすべての外観にカスケードされます。

Circle<Integer> myInt;

コンパイラはコードを次のように解釈します。

public class Circle<Integer> extends ShapeAction<Integer>{
    //Some methods here
}

以下同様に、クラス階層の残りの部分についても同様です。

Tそのため、クラスで型を定義しない場合Circle。コンパイラがパラメータ化されたタイプを通知する方法はありません。ShapeActionこれが、ここでの問題の原因である可能性があります。

于 2012-07-25T17:32:06.733 に答える
2

達成しようとしていることを伝えるのに十分なコードを実際に示していませんが、一般的には次のようになります。

複数のタイプの引数を受け入れることができるメソッドを作成する場合は、クラス全体ではなく、メソッドをパラメーター化する必要があります。

public <T> Shape takeAction(T argument);

明らかに、コンパイル時の型の安全性はそれほど高くありませんが、実行時に制限された型のサブセットに対する引数を手動で解決する必要があります。

于 2012-07-25T17:32:56.187 に答える