プロが教えるわが家の防犯対策術!

■環境
Android(Java)

■前提
HogeClass hoge = new HogeClass();
hoge.execute();
 public class HogeClass extends AsyncTask<Object, Integer, List<Item>> {
  @Override
  protected List<Item> doInBackground(Object... params) {

・引数の「...」初めて見ました
・調べたら、可変長引数、と書いていました

■質問1
・「...右のparams」は、ユーザーが任意でつけて良い文字列でしょうか?

■質問2
・executeで引数指定していないので、doInBackgroundには引数は渡っていない、と考えて良いでしょうか?

■質問3
・executeで引数指定していないのにdoInBackgroundで可変長引数対応している理由は、このメソッド元である抽象メソッド「doInBackground (Params... params)」が可変長引数形式になっているためでしょうか?
http://developer.android.com/reference/android/o …

■質問4
・この場合の「AsyncTask<Object」は何をしているのでしょうか?
・可変長引数で、0個以上の引数を受け付ける際、その型がObjectであることを保障しているだけでしょうか?
・つまり、絶対にObject型の引数を渡すなら、この記述は省略しても良いのでしょうか?

■質問5
・ジェネリクスの使い所について
・型を絶対に保障したい時ってどんなときでしょうか?
・基本的にどんな時でも型は保障した方が良いと思うのですが、そうするとジェネリクスだらけにならない?

A 回答 (1件)

Java 初心者ですが、面白いと思ったので色々調べてみました。


可変長引数は 1.5 以降の機能で、単に配列として受け取れるようです。

import java.util.Arrays;

public class Main {
public Main(Object... objects) {
System.out.println(Arrays.toString(objects));
}
public static void main(String[] args) {
new Main(1, 2, 3);
new Main(1, 2);
new Main(1);
new Main("a", "b", 1, 2);
}
}

を実行すると、

[1, 2, 3]
[1, 2]
[1]
[a, b, 1, 2]

となり、異なる型のオブジェクトが入っている、配列として、
扱われていることがわかります。
名前が関係ないこともわかります。

参照されている API を見ると、execute から呼ばれる
doInBackground の引数の型と、onProgressUpdate の引数の型、
onPostExecute の引数の型、とを指定して、継承せよ、
と読めるように思います。
無視して良い場合は、Void 型を指定せすれば良いようです。

質問の例では、doInBackground は Object 型の引数を取る、
onProgressUpdate は Integer 型の引数(アンボックスされて
int 型になる)を取る、onPostExecute は Item を内容に持つ List 型
を引数を取る、ことがわかります。
execute はそれらを踏まえた上で実行されるので、
params は使ってないのだと思います。Void としても同じでしょう。
ただ、オーバーライドする以上、可変長であることは明示しないと
ダメだと思います。

私がジェネリックを便利だと思ったのは、TreeSet を使った時です。
インターフェイス Comparable を持つクラスなら、ソートされた順で
取り出しができるので。compareTo で、そのクラスのためだけを
考えて、実装すれば良いので。null との比較の場合分けとかを
気にしなくて良いので便利です。

こんなかんじです。

import java.util.*;

public class Example implements Comparable<Example> {
private String contents;
public Example(String s) { this.setContents(s); }
public String getContents() { return this.contents; }
public void setContents(String s) { this.contents = s; }
public int compareTo(Example o) {
return this.getContents().compareTo(o.getContents());
}
public String toString() { return this.getContents(); }
public static void main(String[] args) {
Set t = new TreeSet<Example>();
t.add(new Example("c"));
t.add(new Example("a"));
t.add(new Example("b"));
System.out.println(t);
}
}

タイピングするのが面倒という人も多いようで、stackoverflow に
http://stackoverflow.com/questions/683533/type-a …
というのがありました。java generics type alias で検索した結果です。
    • good
    • 0
この回答へのお礼

回答ありがとうございました。
勉強になりましたー

お礼日時:2013/10/20 11:55

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