[英]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.