Created
May 11, 2013 14:33
-
-
Save hiroisojp/5560120 to your computer and use it in GitHub Desktop.
java8 default method test.
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
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