6

「クラスキャスト例外がスローされるため、これは呼び出されません」と言った奇妙なコードを見つけました。コードが呼び出されて機能します。

誰でも私に説明できますか:なぜこれが機能するのですか?

メソッド getZipList() は文字列のリストを返すように定義されていますが、内部ロジックは異なるオブジェクトのリストを返しています。また、メイン メソッド内では、文字列のリストが「リスト」として期待されますが、リストには異なるものが含まれています。

public class GenericMethodList{
    public static void main(String [] args)
    {
        GenericMethodList o = new GenericMethodList();
        List<String> list = o.getZipList(true);

        Iterator<?> iter = list.iterator();
        while (iter.hasNext()){
            ZipCode zipplace = (ZipCode) iter.next();
            System.out.println(zipplace.value);
        }
    }

    public List<String> getZipList(boolean someParameter){
        //why is this not throwing an exception at runtime?
        List list;
        if(someParameter){
            list = getZipCodes();//List<ZipCode>
        } else {
            list = getZipStreets();//List<ZipStreet>
        }
        return list;
    }

    private List<ZipCode> getZipCodes(){
        List<ZipCode> list = new ArrayList<ZipCode>();
        list.add(new ZipCode("code1"));
        list.add(new ZipCode("code1"));
        return list;
    }

    private List<ZipStreet> getZipStreets(){
        List<ZipStreet> list = new ArrayList<ZipStreet>();
        list.add(new ZipStreet("street1"));
        list.add(new ZipStreet("street2"));
        return list;
    }

    public class ZipCode{
        public String value;
        public ZipCode(String value){
            this.value = value;
        }
    }

    public class ZipStreet {
        public String value;
        public ZipStreet(String value){
            this.value = value;
        }
    }
}

ご説明いただきありがとうございます。

4

5 に答える 5

4

return list生の型をパラメーター化された型として返しているため、行に対して「未チェックのキャスト」コンパイラ警告が表示されている必要があります。この位置で、生の型 (要素の型に関する情報がないだけ) から、メソッドに対して宣言されているパラメーター化された型への "未チェックのキャスト" が実行されます。型パラメーターは、任意の型である可能性があります。コンパイラーは、何を許可し、何を禁止するかを単純に認識していません。

このキャストは、実行時に実行できないという意味でチェックされていません。実行時にlistインスタンスの型パラメーターはとにかく消去されるため、JVM はユーザーがそこで悪いことをしていることを認識しません。

于 2013-08-09T09:36:47.687 に答える
0

コンパイル時に warring を下回る必要があります。

 Note: Some input files use unchecked or unsafe operations.
 Note: Recompile with -Xlint:unchecked for details.

Generics は型 eraseの実装に基づいているためです。そのため、実行時にはジェネリック型 (一般に非具体化可能型と呼ばれる)に関する情報はありません。

于 2013-08-09T09:42:54.407 に答える