このインターフェースを実装するインターフェースと複数のクラスがあるとしましょう。
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]
コメントを追加