74

私は次のクラスとインターフェースを持っています:

public class BasicObject{...}
public interface CodeObject{...}

引数がBasicObject型である必要があり、CodeObjectを実装するメソッドを作成したいと思います。次のコードを試しましたが、clazzがCodeObjectを実装するクラスであるとは限りません。

myMethod(Class<? extends BasicObject> clazz){...}

私はこのようなことをしたいのですが、コンパイルされません:

myMethod(Class<? extends BasicObject implements CodeObject> clazz){...}
4

4 に答える 4

111

パターンクラスは、拡張BasicObjectおよび拡張/実装する必要CodeObjectがあります(実際にはインターフェイスです)。次のように、メソッドシグネチャのワイルドカード定義で宣言された複数のクラスを使用してこれを行うことができます。

public <T extends BasicObject & CodeObject> void myMethod(Class<T> clazz)

次のいずれかの方法で実行すると、機能しないことに注意してください。

  • public <T extends BasicObject, CodeObject> void myMethod(Class<T> clazz)

    これは技術的に有効な構文ですが、CodeObject使用されていません。BasicObjectメソッドは、拡張/実装するかどうかに関係なく、拡張するすべてのクラスを受け入れますCodeObject

  • public void myMethod(Class<? extends BasicObject & CodeObject> clazz)
    public void myMethod(Class<? extends BasicObject, CodeObject> clazz)

    Javaによると、これらは間違った構文です。

于 2012-05-17T18:58:12.123 に答える
11

これは少し冗長なアプローチですが、ジェネリックの頭痛の種を避けます。拡張/実装を行う別のクラスを作成します。

public abstract class BasicCodeObject 
    extends BasicObject 
    implements CodeObject {...}

次に、メソッドは次のようになります。

public <T extends BasicCodeObject> void myMethod(Class<T> clazz) {...}
于 2012-05-17T19:28:20.650 に答える
8

拡張して実装するメソッド引数でクラス型を渡すか、それを行うクラスオブジェクトを渡すかによって、問題には2つのアプローチがあります。両方の解決策があります。BasicObjectCodeObject

解決策1:

自分自身を渡したい場合はClass、@ bontadeで説明されているように、これを行うことができます。

public <R extends BasicObject & CodeObject> void myMethod(Class<R> clazz)

オブジェクトを渡したい場合はclass、次のように記述できます。

public <R extends BasicObject & CodeObject> void myMethod(R clazz)

上記は、ジェネリックを扱うより複雑な方法です。

解決策2:解決策2:

以下はより単純なものです。拡張するクラスを拡張する抽象クラスを定義して、それを実装できます。

public abstract class TargetClassType extends BasicObject implements CodeObject {

}

クラス自体を渡したい場合は、

public void myMethod(Class<TargetClassType> clazz)

または、クラスオブジェクトを渡したい場合は、次のように記述します。

public void myMethod(TargetClassType clazz)

上記の解決策のいずれかがあなたの質問に当てはまりますが、2番目の解決策はより簡単です。

于 2016-07-24T10:25:00.623 に答える
1

すべてのBasicObjectsがCodeObjectを実装していない場合は、メソッドでinstanceof / Class.isInstance()チェックを使用できます(http://docs.oracle.com/javase/1.5.0/docs/api/java/lang/Classを参照)。 .html):

myMethod(Class<? extends BasicObject> clazz)
{
    if (!clazz.isInstance(CodeObject))
    {
        (indicate that the call was incorrect)
    }
    ...
}
于 2012-05-17T18:47:26.937 に答える