generic なメソッドの定義方法− の使い方
前回、「何で countElements(Set<E> set) と定義するとコンパイルエラーになるのか?」という宿題があったので、それを解いていきます。
やりたいこと
Set を引数にとり、その要素数を返すメソッドを定義します。
で、Set の型を任意にしたい+ <?> を使いたくないということで、任意の型を表す <E> を使うこととします。
誤
以下のように定義したのですが…これはコンパイルエラーになります。
private int countElements(Set<E> set) {
if (set == null) {
return 0;
}
return set.size();
}
正
アクセス修飾子と戻り値の間にも、<E> を定義する必要がありました (;´∀`)
こう定義してあげないと、後続の <E> が何を指すのかを compiler が理解できないのだそうです。
private <E> int countElements(Set<E> set) { if (set == null) { return 0; } return set.size(); }
結論
<E> をメソッドの定義に使う時には、Set とかの Collection だけではなく、アクセス修飾子と戻り値の間にも <E> を定義しましょう。