LoginSignup
2
2

More than 5 years have passed since last update.

Java8インターフェースのデフォルト実装がもたらす罠

Posted at

EOLなバージョン使うのやめようぜ...

久しぶりぶりか、もしかしたら初めてかもしれないIteratorを実装してみたんですよ。
コミットしたら何故か他の人のEclipseでは赤くなるんですよね。

Java8Iterator.java
import java.util.Iterator;

public class Java8Iterator implements Iterator<Integer> {

    @Override
    public boolean hasNext() {
        // TODO Auto-generated method stub
        return false;
    }

    @Override
    public Integer next() {
        // TODO Auto-generated method stub
        return null;
    }

}
Java7Iterator.java
import java.util.Iterator;

public class Java7Iterator implements Iterator<Integer> {

    @Override
    public boolean hasNext() {
        // TODO Auto-generated method stub
        return false;
    }

    @Override
    public Integer next() {
        // TODO Auto-generated method stub
        return null;
    }

    @Override
    public void remove() {
        // TODO Auto-generated method stub

    }

}

違いがわかるだろうか? Java7Iteratorではremoveメソッドあり、Java8Iteratorではremoveメソッドが実装されていないのだ。実装されていなくても問題の無い環境があったり、実装されていないとコンパイルエラーな環境もある。

プロジェクトのJava Build Pathを見ると「JRE System Library [JavaSE-1.6]」だ。Java7ですらなかったのか!

image.png

プロジェクトの設定がJava 1.6でもjre1.8.0を使っていると、Eclipseの「Add unimplemented methods」で生成されるコードにはremoveメソッドが含まれない。
ちゃんとjre1.6を使うようにCompatible JREを設定すると、生成されるコードにはremoveメソッドが含まれるようになった。

JDK8のsrc.zipを確認すると、Iteratorインターフェースにはデフォルト実装が記述されてますね。デフォルト実装があると未実装メソッドとしては扱われないと。

そういうわけでEOLなバージョンのJavaを葬るか、しっかりCompatible JREを設定するかしましょう。

2
2
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
2
2