JDK 8の新機能により、バイナリ互換性を維持しながら既存のインターフェースに追加できます。
構文は次のようなものです
public interface SomeInterface() {
void existingInterface();
void newInterface() default SomeClass.defaultImplementation;
}
このようにしてSomeInterface
、この新しいバージョンにアップグレードするときの既存のすべての実装で、突然コンパイルエラーが発生することはありませんnewInterface()
。
これは素晴らしいことですが、実装しなかった新しいデフォルトのメソッドを両方とも追加した2つのインターフェイスを実装するとどうなりますか?例を挙げて説明しましょう。
public interface Attendance {
boolean present() default DefaultAttendance.present;
}
public interface Timeline {
boolean present() default DefaultTimeline.present;
}
public class TimeTravelingStudent implements Attendance, Timeline {
}
// which code gets called?
new TimeTravelingStudent().present();
これはJDK8の一部として定義されていますか?
Javaの神々がここhttp://cs.oswego.edu/pipermail/lambda-lib/2011-February/000068.htmlで似たようなことを話しているのを見つけましたが、それはプライベートメーリングリストの一部であり、直接尋ねることはできません。
JDK 8でデフォルトがどのように使用され、ラムダをサポートするようにコレクションインターフェースを拡張するかについての詳細は、https://oracleus.wingateweb.com/published/oracleus2011/sessions/25066/25066_Cho223662.pdfを 参照してください。