在我的应用程序中,我在某些servlet中创建了一个ArrayList,该ArrayList是使用request.setAttribute()作为“ testList”分配的。然后将请求转发到jsp页面。 在jsp页面内,我想检索整个ArrayList并对其进行迭代。
我使用了getAttribute(),但此后我无法从该对象检索ArrayList。
一个ArrayList包含由我在另一个类(已正确导入)中创建的对象TestObject。我想通过ArrayList进行迭代来访问它。
Object testList = request.getAttribute("testList");
ArrayList<TestObject> localList = new ArrayList<TestObject>();
localList = testList;
//Type mismatch: cannot convert from Object to ArrayList<TestObject>
从Object到ArrayList获取数据的最佳实践是什么?
我应该使用强制类型转换吗(IDE警告:类型安全性:未经检查的从Object到ArrayList的强制类型转换)? 还是泛型? 还是...?
答案 0 :(得分:0)
您需要的是演员表。防御解决方案在强制转换之前检查类型是否正确:
Object testList = request.getAttribute("testList");
if (testList instanceof Collection) {
for (Object obj : (Collection<?>) testList) {
if (obj instanceof TestObject) {
TestObject currentTestObject = (TestObject) obj;
// Do something with currentTestObject
}
}
}
要遍历从request.getAttribute
返回的列表,您只需要假定它是Collection
,而不必是ArrayList
。由于ArrayList
实现了Collection
接口,因此上述代码将与ArrayList
以及其他集合类型一起使用。如果只希望它与List
或仅与ArrayList
一起使用,则只需在代码中使用其中一种类型而不是Collection
。
考虑将else
部分添加到if
语句中,并发出日志消息,如果运行时类型不符合预期,则执行其他一些适当的操作。
如果您确定总是得到ArrayList<TestObject>
,则可以省略支票:
Collection<TestObject> testList = (Collection<TestObject>) request.getAttribute("testList");
for (TestObject currentTestObject : testList) {
// Do something with currentTestObject
}
这有点简单。
答案 1 :(得分:-2)
您可以将对象传递给ArrayList构造函数:
Object testList = request.getAttribute("testList");
ArrayList<TestObject> localList = new ArrayList<TestObject>(testList);