[英]How to find ArrayList containing Object
我有一個方法,我可以從中返回對象
public static Object login(DataManager dataManager, String userName, String password)
ArrayList<LoginCredentialsBean> loginCredentialsList = new ArrayList<LoginCredentialsBean>();
String authenticated = "false";
Connection connection = null;
try {
connection = dataManager.getConnection();
} catch (Exception e) {
return ("Having problem in connectiong to databaste: " + e.getMessage());
}
if (connection != null) {
try {
...
try {
ResultSet rs = prepStatement.executeQuery();
try {
while (rs.next()) {
...
loginCredentialsList.add(new LoginCredentialsBean(roleId, orgaCode, passwordExpiryDate, date, status, language));
authenticated = "true";
} //end of while()
} finally {
rs.close();
}
} finally {
prepStatement.close();
}
if (authenticated.equals("true")) {
updateUserLogByInserting(connection, userName);
}
} catch(SQLException e) {
System.out.println("Could not login from dataabse:" + e.getMessage());
} finally {
dataManager.putConnection(connection);
}
}
if (authenticated.equals("true")) {
return loginCredentialsList;
} else {
return authenticated;
}
} //end of login()
現在我正在測試它
public static void main(String... args) {
MoneyTreeServices moneyTreeServices = new MoneyTreeServices();
Object result = moneyTreeServices.login("Admin", "cbas1234");
if (result instanceof ArrayList<?>) {
System.out.println("ArrayList instance");
}
System.out.println(result);
}
它返回我的結果
ArrayList instance
[pk.mazars.moneyTree.bean.LoginCredentialsBean@b7ec5d]
我想問我是否使用像ArrayList<?>
這樣的條件。 我如何檢查包含LoginCredentialsBean對象的ArrayList。 就像我使用時一樣
if (result instanceof ArrayList<LoginCredentialsBean>) {
}
我得到錯誤
Can not perform instanceof check against parameterized type ArrayList<LoginCredentialsBean>. Use the form ArrayList<?>
我想檢查instanceof ArrayList,arraylist有LoginCredentialsBean嗎?
謝謝。
參數化類型信息在編譯時被擦除,而instanceof
在(fanfare)運行時被解析 - 這就是你得到該錯誤的原因。
你可以做的是迭代List
的元素和它們的instanceof
。
干杯,
簡短的回答是, 你做不到 。 泛型是通過類型擦除實現的 - 它們實際上是一個編譯時語法糖,以確保您不將Integer
放入List<String>
。
但是,運行時對象本身只是原始類型。 ArrayList
一個實例不知道它是一個ArrayList<String>
(或者更確切地說,它被分配給具有該泛型類型的變量)。 因此,當您使用反射查詢它時,您無法獲得任何通用類型信息。
我能想到兩種廣泛的解決方案。 一種是迭代列表內容並檢查它們的動態類型 - 例如,如果第一個元素是LoginCredentialsBean
,那么假設你有一個List<LoginCredentialsBean>
是合理的。 這不會對空列表的工作,雖然,這可能是一個問題,並有可能產生假陽性(如List<Object> allParameters
可能恰好有一個LoginCredentialsBean
作為它的第一個元素...)
另一種是顯式傳遞元數據對象 - 所以在這種情況下,你將從login
方法返回Object
,以及描述它是什么類型的對象的標記。 這可能是一個簡單的枚舉常量; 或者轉到另一個極端,您可以使令牌通常鍵入,這樣編譯器可以根據您返回的類型檢查這一點,並確保令牌是類型正確的。
但無論如何, instanceof
太少(信息),太晚了。
請注意,您的login
方法看起來很奇怪。 我認為它根本不應該返回一個Object
,因為它只是懶惰而且完全顛覆了靜態類型系統,它可以幫助你。 相反,我認為它應該只返回一個List<LoginCredentialsBean>
其中包含與給定登錄相關的憑據。
您有三個不同的路徑返回。 第一種是在連接到數據庫時遇到異常 - 在這種情況下,您應該拋出異常 ! 返回帶有錯誤詳細信息的字符串非常不典型且令人困惑 - 異常條件應作為Exception
處理,這就是它們的用途。
另外兩種情況是你能夠查找確定結果的情況。 對於失敗的登錄案例,我只返回一個空列表(即此用戶名/密碼沒有任何憑據),同時在成功登錄期間返回填充列表。
如果您非常希望能夠區分登錄失敗和成功登錄(沒有憑據),那么可能會返回復合對象,例如:
class LoginStatus {
final boolean authenticated;
final List<LoginCredentialsBean> credentials;
}
無論哪種方式,調用者確切地知道他們正在返回什么,並且可以適當地調用它上的方法而無需調用instanceof
和typecast。
你必須檢查兩次。
if (result instanceof ArrayList<?>) {
System.out.println("ArrayList instance");
//cast
ArrayList<LoginCredentialsBean> list = (ArrayList<LoginCredentialsBean>) result;
///..check if list contains LoginCredentialsBean
for(int i=0; i<list.size(); i++){
if(list.get(i) instanceof LoginCredentialsBean){
System.out.println("LoginCredentialsBean instance");
}
}
}
沒有像“ArrayList包含LoginCredentialsBean”這樣的東西,ArrayList始終包含Objects。
你必須迭代列表並檢查每個對象:
for (Object o: result) {
if (!(o instanceof LoginCredentialsBean)) {
//Fail
}
}
您可以使用contains(Object o)
來檢查ArrayList是否包含您的對象。 使用instanceof List
檢查給定對象是否為List。 由於運行時類型擦除,List的泛型類型將不可用
如果您的login
方法返回Object
類型,則無法以您嘗試的方式檢查此方法。 由於類型擦除,類型參數僅在編譯時存在。 您需要檢查重新調整的對象是List
還是Collection
還是Iterable
,然后迭代它並檢查每個項目(如果它是LoginCredentialsBean
的實例)。
但是,您的代碼是糟糕設計的一個例子。 返回String
或列表的方法是錯誤的。 為了使它正確:
List<LoginCredentialsBean>
public static List<LoginCredentialsBean> login(DataManager dataManager, String userName, String password) throws AuthenticationException {...}
注意:使用boolean
來保留邏輯數據而不是"true"
或"false"
字符串。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.