次の汎用 FunctionalInterface があります。
@FunctionalInterface
public interface FooInterface<T> {
void bar(T arg);
}
そして、この ArrayList の子孫:
public class FooList<T> extends ArrayList<FooInterface<T>> {
public void doFoo(T arg) {
for(Iterator<FooInterface<T>> i = iterator(); i.hasNext(); ) {
i.next().bar(arg);
}
}
}
ここで、メソッド参照と型消去を使用して次のコードを記述します。
protected void doFoo(Object arg) { }
private void doStuff() {
FooInterface f = this::doFoo;
List<FooInterface> list = new ArrayList<>();
list.add(f2);
list.add(this::doFoo);
FooList list2 = new FooList();
list2.add(f2);
list2.add(this::doFoo); // <-- Compiler chokes here, complaining that this is not a FunctionalInterface
}
これは私を困惑させます。this::doFoo を FooInterface 変数に割り当て、コードの最初の部分で List.add() を呼び出しても、ArrayList から派生したクラスから同じ add() メソッドを呼び出すことを拒否するだけで、コンパイラが問題ないのはなぜですか。 ?
私の子孫クラスの型消去で何かおかしなことが起こっているようですが、何ですか? これはバグですか?サポートされていないことをしましたか?