Java 標準アノテーションのサンプル

Javaの標準で用意されているアノテーションのサンプルです。java.langパッケージにあります。

目次

サンプル オーバーライドの必要を示す @Override
  非推奨を示す @Deprecated
  コンパイル時の警告を表示しない @SuppressWarnings
  可変長引数で警告を出さない @SafeVarargs
  関数型インターフェースか確認する @FunctionalInterface
  以下の@Overrideのエラーが出る場合

オーバーライドの必要を示す @Override

@Overrideは、メソッドがオーバーライドされていない場合はコンパイルエラーになります。
オーバーライドしているはずがスペルミスでされていないというミスを防ぎます。

package test1;

class Test {
    void print() {
        System.out.println("");
    }
}
class Sample1 extends Test {
    @Override
    void print() {
        System.out.println("1");
    }
}
public class Test1 {
    public static void main(String[] args) {
        Sample1 s1 = new Sample1();
        s1.print(); //1
    }
}

8行目のクラスは、3行目のクラスを継承しています。
9行目は、@Overrideアノテーションです。親クラスにprintメソッドがない場合(オーバーライドされていない場合)、コンパイルエラーになります。

 

非推奨を示す @Deprecated

@Deprecatedは、非推奨であるという注釈です。非推奨なので使用はできます。
Javadocにしたときは非推奨がわかるように出力されます。

package test1;

class Sample1 {
    @Deprecated
    void print() {
        System.out.println("1");
    }
}
public class Test1 {
    public static void main(String[] args) {
        Sample1 s1 = new Sample1();
        s1.print(); //1
    }
}

4行目は、@Deprecatedアノテーションです。
5行目のメソッドが非推奨であることを示しています。

 

コンパイル時の警告を表示しない @SuppressWarnings

@SuppressWarningsは、コンパイル時の警告を表示しないようにします。
意図して警告がでるやり方をしている場合で、その警告を非表示にしたい時に使用します。

package test1;

class Sample1 {
	@SuppressWarnings("unused")
	void print() {
		int i;
		System.out.println("1");
	}
}
public class Test1 {
	public static void main(String[] args) {
		Sample1 s1 = new Sample1();
		s1.print(); // 1
	}
}

4行目は、@SuppressWarningsアノテーションで、引数はunusedです。
6行目の変数は未使用で本来なら警告がでますが、@SuppressWarningsアノテーションでその警告をださないようにしています。

 

可変長引数で警告を出さない @SafeVarargs

可変長引数でジェネリクスを使用すると警告がでますが、@SafeVarargsアノテーションでその警告をださないようにできます。

package test1;
import java.util.ArrayList;
import java.util.List;

class Sample1{
    @SafeVarargs
    static void print1(List<String>... test){
        for (List<String> c : test) {
            System.out.println(c);
        }
    }
}
public class Test1 {
    public static void main(String[] args) {
        List<String> hiragana = new ArrayList<>();
        hiragana.add("あ");
        hiragana.add("い");
        List<String> romaji = new ArrayList<>();
        romaji.add("a");
        romaji.add("b");
        Sample1.print1(hiragana,romaji); //[あ, い][a, b]
    }
}

6行目は、@SafeVarargsアノテーションです。
7行目は、@SafeVarargsアノテーションでその警告をださないようにしています。

 

関数型インターフェースか確認する @FunctionalInterface

@FunctionalInterfaceは、インターフェースが関数型インターフェースかチェックします。
メソッドが1つでない場合にエラーになります。

package test1;

@FunctionalInterface
interface InterfaceA {
	int cnt1 = 3;
	void printA();
	//void printB();
}
class Class1 implements InterfaceA{
	@Override
	public void printA() {
		System.out.println(cnt1);
	}
}
public class Test1 {
	public static void main(String[] args) {
		Class1 c1 = new Class1();
		c1.printA(); // 3
	}
}

3行目は、@FunctionalInterfaceを記述しています。
6行目は、メソッドを1つのみ記述しているのでエラーになりません。
7行目のコメントを外すとメソッドが2つになりエラーになります。

 

※以下の@Overrideのエラーが出る場合

The method メソッド名 of type クラス名 must override a superclass method
(そのメソッドは、親クラスのメソッドをオーバーライドしなければならない)

解決策

Java Compilerのバージョンが1.5の場合のときがあるので1.5より大きい値に変更します。
設定は2箇所あります。2020年10月でも発生しました。

1箇所目、Window→Preferences→java compiler

 

2箇所目、プロジェクトを右クリック→properties→java compiler

関連の記事

Java 独自のアノテーションで値を取得するサンプル
Java ラムダ式のサンプル

△上に戻る