1. ホーム
  2. java

メソッド引数 extends class implements interface

2023-10-02 21:51:03

質問

以下のようなクラスとインタフェースがあります。

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

引数がBasicObject型でCodeObjectを実装している必要があるメソッドを作りたいのです。以下のコードを試してみましたが、clazzがCodeObjectを実装しているクラスであることが保証されません。

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

このようなことをしたいのですが、コンパイルできません。

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

どのように解決するのですか?

パターン・クラスは 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によれば、単なる間違った構文です。