gpt4 book ai didi

java - 如何查找包含Object的ArrayList

转载 作者:行者123 更新时间:2023-12-02 07:30:02 26 4
gpt4 key购买 nike

我有一个方法,我可以从中返回对象,例如

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<?>

我想检查 ArrayList 的实例并且 arraylist 是否有 LoginCredentialsBean ?

谢谢。

最佳答案

简短的回答是你不能。泛型是通过类型删除来实现的 - 它们实际上是编译时语法糖,以确保您不会放置 Integer进入List<String> .

然而,运行时对象本身只是原始类型。 ArrayList 的一个实例不知道这是一个ArrayList<String> (或者更确切地说,它被分配给具有该通用类型的变量)。因此,当您通过反射询问它时,您无法获得任何通用类型信息。

我能想到两种广泛类型的解决方案。一种是迭代列表内容并检查其动态类型 - 如果第一个元素是 LoginCredentialsBean ,例如,那么可以合理地假设您有 List<LoginCredentialsBean> 。但这不适用于空列表,这可能是一个问题,并且可能会产生误报(例如 List<Object> allParameters 可能碰巧有 LoginCredentialsBean 作为其第一个元素...)

另一种方法是显式传递元数据对象 - 因此在这种情况下您将返回 Object来自login方法,以及描述它是什么类型的对象的标记。这可以是一个简单的枚举常量;或者走向另一个极端,您可以将 token 设置为通用类型,以便编译器可以根据您返回的内容的类型进行检查,并确保 token 的类型正确。

但无论如何,instanceof (信息)太少,太晚了。

<小时/>

请注意,您的 login方法看起来……很奇怪。我认为它不应该返回 Object根本没有,因为这只是懒惰并且完全颠覆了静态类型系统,这将在这里帮助您。相反,我认为它应该只返回 List<LoginCredentialsBean>包含与给定登录相关的凭据。

你有3条不同的返回路径。第一个是连接数据库时是否遇到异常 - 在这种情况下您应该抛出异常!返回包含错误详细信息的字符串是非常不典型且令人困惑的 - 异常情况应作为 Exception 处理。 ,这就是他们的目的。

另外两种情况是您能够查找明确结果的情况。对于登录失败的情况,我只会返回一个空列表(即该用户名/密码没有任何凭据),而在成功登录期间返回填充的列表。

如果您强烈希望能够区分登录失败和成功登录(没有凭据),那么也许可以返回一个复合对象,例如:

class LoginStatus {
final boolean authenticated;
final List<LoginCredentialsBean> credentials;
}

无论哪种方式,调用者都知道他们要返回什么,并且可以适本地调用它的方法,而不必调用 instanceof并进行类型转换。

关于java - 如何查找包含Object的ArrayList,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/13026229/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com