1

Javaクラスのこの部分を考えると、

private List<Object> components = new ArrayList<Object>();

private A a;
private B b;
private C c;

add(a, b, c);

public void add(Object... component){
    for(Object o : component) {
        components.add((CAST)o);
    }

}

オブジェクトoを適切なタイプでリストにキャストしたいと思います。

ここで期待される結果はA a, B b, C c、私のリストに含まれることです。

getClass()を試してみましたが、コンパイルしませんでした。予想されるJavaタイプをすでに知っていることを考慮して、オブジェクトをアップキャストするにはどうすればよいですか?

編集:

タイプAの最初のオブジェクト、タイプBの2番目のオブジェクト、タイプCの2番目のオブジェクトを追加する必要があります...(追加するアイテムの数はわかりません)リストがあれば、正しく入力されたN個のオブジェクトを含むリストを取得します。(gtt(0)はA、get(1)はB、get(2)はCと入力されます)

オブジェクトの数がわからず、最初はオブジェクトのタイプがわからないため、リストをObjectとして宣言しました。

メソッドを作成しました(addその場合)。varargsは、argsの数がわからないため、コレクション内でループするのに役立ちます。

varargsで最初のオブジェクト、2番目のオブジェクト、3番目のオブジェクト(など)を取得し、それをリストにプッシュするだけですが、A、B、Cなどのオブジェクトタイプは私が受け取ったもの!

もっとはっきりしているかどうかはわかりません。

4

4 に答える 4

1

あなたのリストはすでにオブジェクトを受け入れています

private List<Object> components = new ArrayList<Object>();

なぜアップキャストする必要があるのですか?

于 2012-06-19T22:10:12.797 に答える
1

まず、この場合、決してアップキャストできません。本当にアップキャストが必要な唯一の場所は、B や A ではなく、C 固有のメソッドにアクセスするときです。または A にない B に固有 (または Object のどちらでもない)

于 2012-06-19T22:11:42.567 に答える
1

オブジェクトの実行時型がどのように機能するかを誤解しているようです。「A」をリストに入れると、それは「A」であるのをやめてオブジェクトになるわけではありません。後で取り出して「A」にキャストし直しても、元のランタイム型のままです。リストに入れる前にキャストしても何も得られません。

このことを考慮

Object str = "FOO";
List<Object> list = new LinkedList<Object>();
list.add(str);
String str1 = (String) list.get(0);
System.out.println(str1.length());

'3' を出力します。「FOO」へのポインタの参照型がオブジェクトだったという理由だけで、「FOO」が文字列であることをやめたことはありません。

于 2012-06-19T22:30:22.453 に答える
1

正直に言うと、あなたが与えた例でアップキャストするのはあまり意味がないということで、上記の皆さんに同意します。リストにオブジェクトが含まれると宣言したため、リストからオブジェクトを取得するときに再度キャストする必要があります。ただし、使用できる型比較演算子instanceofは常にあります。

public void add(Object... component){
    for(Object o : component) {
        if(o instanceof CAST)
            components.add((CAST)o);
    }
}
于 2012-06-19T22:30:45.460 に答える