インターフェイスのクラスを知っているだけでインターフェイスを実装するクラスのオブジェクトをメソッドに渡し、それをArrayListに追加するにはどうすればよいですか?

potatox86

このインターフェースを実装するインターフェースと複数のクラスがあるとしましょう。

public interface MyInterface {
   public String getString();
   public String getAnotherString();
}

これで、このインターフェイスを実装するクラスができました。

public class MyClass1 implements myInterface {
   @Override
   public String getString() {
       return "A String";
   }
   @Override
   public String getAnotherString() {
      return "foo";
   }
}

そして:

public class MyClass2 implements myInterface {
    @Override
    public String getString() {
        return "Another String";
    }
    @Override
    public String getAnotherString() {
       return "bar";
    }
}

それを実装するクラスのオブジェクトをメソッドに受け入れさせるにはどうすればよいmyInterfaceですか?

public <T extends MyInterface> void aMethod(T object) {
    objects.add(object); //⚡ doesn't work
}

これは機能しますが、そのように宣言したArrayListにこれらのオブジェクトを追加することはできません。

ArrayList<? extends MyInterface> objects = new ArrayList<>();

私は何が間違っているのですか?:/

問題をデバッグしましょう

ジェネリックのようにMyInterfaceを拡張しますゲッターのみが許可されます

ArrayList<? extends MyInterface> objects = new ArrayList<>();
you can only do get of type MyInterface and Object
MyInterface myInterace = objects.get(0);
Object myInterace = objects.get(0);

あなたのケースが機能するためにあなたは使うことができます ArrayList<MyInterface> objects = new ArrayList<>();

ここで、MyInterfaceの追加が許可されていた場合、簡単な例で何が問題になる可能性があると仮定します。

Long longValue = 20L; 
List<Long> longList = new ArrayList();
longList.add(longValue);

Integer i =10;
List<? extends Number> sNumber = longList ;// longList can be assigned to ? extends Number
sNumber.add(i); // if this was allowed
longValue = longList.get(1);   // we will get an exception (class cast exception)

したがって、コンパイラはそのセッターを許可しません

この記事はインターネットから収集されたものであり、転載の際にはソースを示してください。

侵害の場合は、連絡してください[email protected]

編集
0

コメントを追加

0

関連記事

Related 関連記事

ホットタグ

アーカイブ