アプリ版:「スタンプのみでお礼する」機能のリリースについて

Java5年ぶりでちょっと新しい仕様について教えてください。。

java.util.ArrayListクラスを継承したクラスを作成しようと思っているのですが、継承後のクラスでも
ArrayListChild<E>
というような記述を有効にするには、一体どのような処理をすればよいのでしょうか。

そもそも、<E>とコンストラクタの後などに付けるこの仕様、なんて名前の仕様なんでしょうか。

よろしくお願いします。

A 回答 (1件)

className<E>という仕様は、genericsType(総称型)と呼ばれています。


genericを利用したクラスの定義は以下の例をご覧ください。

public class ArrayListChild<E> extends ArrayList<Object> {
  private E arg;

  public E getArg(); // 定義省略
  public void setArg(E arg); // 定義省略
  public E doSomething(); // 定義省略
}

【注意点】
基底クラスのgeneric typeがObjectではない場合、
派生クラスのgeneric type指定の際に、注意が必要です。

(例) java.io.Writerとその派生クラスのみを許すArrayListを拡張する場合
public class ArrayListChild<T extends java.io.Writer> extends ArrayList<java.io.Writer>

extends java.io.Writerを記述していなくてもコンパイルは通ります。
しかし、Writer派生クラスしか取れないはずなのに new ArrayListChild<String>() などが
コンパイルエラーにならないという、あまりよろしくない状況になります。
    • good
    • 0

お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!