簡體   English   中英

Java 通用:未經檢查的演員表

[英]Java generic: Unchecked cast

我必須使用 Java 17 (LTS)。

以下代碼工作正常,但我有以下警告:

Unchecked cast...

無論我在課堂上做什么,我都無法擺脫這個警告。

出現警告的 class :

public abstract class Parser<T> {

    protected static <T> Parser<T> build(Class<T> parserType, InputArgGroup arguments) {
        Parser<T> parser;
        if (parserType.isAssignableFrom(Name.class)) {
            parser = (Parser<T>) new NameParser();    <- UNCHECKED CAST: x.NameParser to x.Parser<T>
        } else {
            parser = (Parser<T>) new AddressParser(); <- UNCHECKED CAST: x.AddressParser to x.Parser<T>
        }

        parser.hasTitle(arguments.hasTitle());
        parser.hasHeader(arguments.hasHeader());
        parser.setDateTimePattern(arguments.getDateTimePattern());
        ...
        return parser;
    }

    ... common methods ...

    public abstract List<T> parse(String file);
}

解析器 1:

public class NameParser extends Parser<Name> {
    @Override
    public List<Name> parse(String file) {
        System.out.println("parse name CSV");
        return null;
    }
}

解析器 2:

public class AddressParser extends Parser<Address> {
    @Override
    public List<Address> parse(String file) {
        System.out.println("parse address CSV");
        return null;
    }
}

測試:

public class Aaa {
    public Aaa() {
        var addressParser = Parser.build(Address.class, ...);
        var nameParser = Parser.build(Name.class, ...);

        List<Address> addresses = addressParser.parse("addresses.csv");
        List<Name> names = nameParser.parse("names.csv");

    }

    public static void main(String[] args) {
        new Aaa();
    }
}

任何幫助表示贊賞。

這只是一個警告,讓您知道編譯器不能保證強制轉換在運行時不會失敗。 你知道它會起作用,但編譯器還不夠復雜,無法弄清楚。

使用注釋抑制警告。

@SuppressWarnings("unchecked")
protected static <T> Parser<T> build(Class<T> parserType, InputArgGroup arguments) {
   // ...
}

使用這個注解並沒有繞過編譯器——你得到一個警告,在分析和運行測試之后,你驗證了強制轉換在運行時永遠不會失敗,你添加這個注解來記錄分析和發現。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM