簡體   English   中英

類型安全的將對象強制轉換為Class的方法

[英]Type-safe way to cast object to Class

我想刪除對未選中的轉換警告的抑制。 我怎樣才能完全保證將o投給T

注意:此代碼段中的ResultSet是與源無關的專有包裝器。 它與java.sql.ResultSet非常相似,但是並不相同。 另外,將Eclipse Mars.1與Java 8 u45一起使用,IDE和Javac均會發出警告。 我意識到,由於它包含在if語句中,因此從技術上講這不是問題,但是我絕對不喜歡抑制警告。 而且我覺得必須有一種完全類型安全的方法來執行該轉換。

public class ResultSetQuery {
    public static <T> List<T> collectValues(ResultSet rs, String keyName, Class<T> tclass) {

        List<T> result = new LinkedList<>();

        while(rs.next()) {
            Object o = rs.getData(keyName);

            if (tclass.isAssignableFrom(o.getClass())) {

                @SuppressWarnings("unchecked")
                T v = (T)o;

                result.add(v);
            } else {
                result.add(null);
            }
        }

        return result;
    }
}

您打算不盲目地使編譯器警告@SupressWarnings是可以接受的,但是您的代碼示例是@SupressWarnings合理使用的一個很好的示例。 您的代碼不會失敗,並且編譯器仍會抱怨,因此@SupressWarnings是解決之道。

看一下與您的示例具有相同模式的java.lang.Class#cast 它還抑制了警告:

@SuppressWarnings("unchecked")
public T cast(Object obj) {
    if (obj != null && !isInstance(obj))
        throw new ClassCastException(cannotCastMsg(obj));
    return (T) obj;
}

你可以寫:

            if (tclass.isAssignableFrom(o.getClass())) {
                result.add(tclass.cast(o));
            }

(請參閱https://docs.oracle.com/javase/7/docs/api/java/lang/Class.html#cast(java.lang.Object) 。)


編輯添加:順便提一句,正如erickson在評論中指出的那樣,您可能應該編寫tclass.isInstance(o)而不是tclass.isAssignableFrom(o.getClass()) :它更簡單tclass.isAssignableFrom(o.getClass()) ,並且當o時避免了NullPointerException一片空白。

暫無
暫無

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

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