Skip to content

Instantly share code, notes, and snippets.

@hiroisojp
Created May 11, 2013 14:33
Show Gist options
  • Star 0 You must be signed in to star a gist
  • Fork 0 You must be signed in to fork a gist
  • Save hiroisojp/5560120 to your computer and use it in GitHub Desktop.
Save hiroisojp/5560120 to your computer and use it in GitHub Desktop.
java8 default method test.
package com.hiroisojp.java8.defaultmethod;
import org.junit.Test;
import static org.hamcrest.CoreMatchers.is;
import static org.junit.Assert.assertThat;
/**
* 以下の環境で検証
* OS:MaxOSX 10.8.3
* Java:Java(TM) SE Runtime Environment (build 1.8.0-ea-lambda-nightly-h4200-20130429-b88-b00)
*/
public class DefaultMethodTest {
public interface A{
default public String name(){
return "A";
}
}
public interface B extends A {
@Override
default public String name(){
return "B";
}
}
public interface C extends A {
@Override
default public String name(){
return "C";
}
}
public interface D extends A {
}
public abstract class E implements A, B, C{
@Override
public String name(){
return "E";
}
}
// experimental
// public abstract class E implements A, B, C{
// // idea なぜかコンパイルエラーになってくれない(javacでするとコンパイルエラー)
// }
// public abstract class E implements B, C{
// // これはコンパイルエラーになる
// }
public class F extends E {
}
public class X implements B, A{
// B のデフォルト実装が使われる
}
public class Y implements B, D{
// B のデフォルト実装が使われる(D は、Aの実装をオーバライドしていないためセーフ)
}
public class Z implements B, C{
@Override
public String name(){
// B、Cは違うものと認識されて、いずれかを選択しないといけない(コンパイルエラーになる)
// エラー内容:Zは型BとCからname()の関連しないデフォルトを継承します
return C.super.name();
}
}
public class X2 implements A, B{
// implmentsの順序を変えてもBの実装が使われる。
}
public class Y2 implements D, B{
// implmentsの順序を変えてもBの実装が使われる。
}
@Test
public void defaultMethodTest(){
X x = new X();
assertThat(x.name(), is("B"));
// implmentsの実装順序を変えても同じ実装が利用される
X2 x2 = new X2();
assertThat(x2.name(), is("B"));
Y y = new Y();
assertThat(y.name(), is("B"));
Y2 y2 = new Y2();
assertThat(y2.name(), is("B"));
// 明示的に指定した実装が利用される
Z z = new Z();
assertThat(z.name(), is("C"));
F f = new F();
assertThat(f.name(), is("E"));
}
}
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment