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

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

目次

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

オーバーライドの必要を示す @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メソッドがオーバーライドされていない場合、コンパイルエラーになります。

@Overrideでエラーが出る場合

問題点

@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→javacompiler

Java

 

非推奨を示す @Deprecated

@Deprecatedは、非推奨であるという注釈です。

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つになりエラーになります。

関連の記事

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

△上に戻る