Help us understand the problem. What is going on with this article?

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

More than 3 years have passed since last update.

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を設定するかしましょう。

shimitei
Why not register and get more from Qiita?
  1. We will deliver articles that match you
    By following users and tags, you can catch up information on technical fields that you are interested in as a whole
  2. you can read useful information later efficiently
    By "stocking" the articles you like, you can search right away