0

機能を追加するためにオープンJDKを変更していますが、これに2回遭遇しましたが、適切な解決策はありません。

JCStatementを拡張するという名前のクラスがありますJCTree

List<JCStatement>問題:をにキャストしたいList<JCTree>

クラスがその拡張機能の1つを参照できることは明らかですが、リストにある場合は機能しません。

私は使用しました:(List<JCTree>)((List<?>)params)キャストするために、これは機能しますが、antに基づいていません。IDEは私に次の警告を出します:

Type safety: Unchecked cast from List<capture#1-of ?> to List<JCTree>

したがって、これは何らかの方法で回避する必要があります。

助けていただければ幸いです。

4

5 に答える 5

2

このキャストはできません。

にをキャストしてList<JCStatement>から、List<JCTree>そのリストにJCTree(非JCStatement)オブジェクトを追加するとどうなりますか?List<JCStatement>型安全性を損ないます。

于 2012-05-29T16:32:08.453 に答える
2

リストに要素を追加しないことがわかっている場合(つまり、タイプセーフになります)、Collections.unmodifiableList(List<? extends E>)はを返しますList<E>

これは完全にタイプセーフで合法です。これは、リストに不正な要素が追加されないことが保証され、JDKによって提供されるためです。

于 2012-05-29T17:10:09.000 に答える
1

このようなものはあなたのために働きますか?

import java.util.ArrayList;
import java.util.List;

class A {
}

class B extends A {
}

class C extends A {
}

public class Program {
    public static void foo(List<? extends A> list) {
    }

    public static void main(String[] args) {
        List<A> listA = new ArrayList<A>();
        List<B> listB = new ArrayList<B>();
        List<C> listC = new ArrayList<C>();
        List<? extends A> listX = (List<? extends A>) listB;
        List<? extends A> listY = (List<? extends A>) listC;

        foo(listA);
        foo(listB);
        foo(listC);
        foo(listX);
        foo(listY);
    }
}
于 2012-05-29T16:31:50.093 に答える
1

これは、リスト、または一般的なジェネリック型コレクションの問題のようです。

これまでで最も簡単なソリューション:

ListBuffer<JCTree> ls = new ListBuffer<JCTree>();
for(JCVariableDecl v : params){ ls.append(v); }
return ls.toList();
于 2012-05-29T18:27:01.880 に答える
0

Raw Typeをキャストすることで、安全であると本当に確信している場合は、それを行うことができます。

List<Number> listA = new LinkedList<Number>();
List<Integer> listB = new LinkedList<Integer>();
listA = (List<Number>)(List) listB;

それが問題の良い解決策だと思ったことは想像できませんが、それはあなたが望むことをするでしょう、そしてコンパイル時のジェネリックにはいくつかの苛立たしい制限があります:)

あなたがしていることは実際には安全ではないので、安全でないキャストには常に警告があります。コンパイラが安全にする方法はありません。自分でそれを確認する必要があります。

于 2012-05-29T17:05:26.160 に答える