基于这个Spring教程:http://www.roseindia.net/tutorial/spring/spring3/ioc/springlistproperty.html我遇到了问题。我使用Spring框架来创建对象列表,但我想获得列表列表。从ArrayList到ArrayList的转换是不可能的,所以我已经创建了自己的静态方法。我们有两个分会:
学生:
public class Student {
private String name;
private String address;
//getters and setters
}
学院:
import java.util.List;
public class College {
private List<Object> list;
public List<Object> getList() {
return list;
}
public void setList(List<Object> list) {
this.list = list;
}
}
和context.xml
<?xml version="1.0" encoding="UTF-8"?>
<beans xmlns="http://www.springframework.org/schema/beans"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://www.springframework.org/schema/beans
http://www.springframework.org/schema/beans/spring-beans.xsd">
<bean id="Student" class="testing.Student">
<property name="name" value="Thomas"/>
<property name="address" value="London"/>
</bean>
<bean id="College" class="testing.College">
<property name="list">
<list>
<value>1</value>
<ref bean="Student"/>
<bean class="testing.Student">
<property name="name" value="John"/>
<property name="address" value="Manchester"/>
</bean>
</list>
</property>
</bean>
</beans>
这是我的主要方法:
public static void main(String[] args) {
BeanFactory beanFactory = new ClassPathXmlApplicationContext(
"context.xml");
College college = (College) beanFactory.getBean("College");
}
我想在这里做的是通过从包含对象列表的大学对象接收它来制作通用学生ArrayList。这是我的解决方案:
import org.springframework.beans.factory.BeanFactory;
import org.springframework.context.support.ClassPathXmlApplicationContext;
import java.util.ArrayList;
public class MainTest {
//This is my casting static method:
public static ArrayList<Student> castListToStudent(College college) {
ArrayList<Student> casted = new ArrayList<Student>();
Student s = null;
for (int i = 0; i < college.getList().size(); i++) {
if (college.getList().get(i) instanceof Student) {
s = (Student) college.getList().get(i);
casted.add(s);
}
}
return casted;
}
public static void main(String[] args) {
BeanFactory beanFactory = new ClassPathXmlApplicationContext(
"context.xml");
College college = (College) beanFactory.getBean("College");
ArrayList<Student> list = castListToStudent(college);
for (Student s : list) {
System.out.println(s);
}
}
}
看起来它正在运行,但问题是 - 它是将一个列表安全地转换为另一个列表的最佳方法吗?
答案 0 :(得分:3)
使用番石榴:
List<Object> objects = Lists.newArrayList();
objects.add("A");
objects.add("B");
List<String> strings = FluentIterable.from(objects).filter(String.class).toList();
此示例返回ImmutableList
如果您需要可变列表(ArrayList
):
List<String> strings = Lists.newArrayList(Iterables.filter(objects, String.class));
objects
中String
(在我的示例中)中的任何元素都将被忽略。这是一种完全类型安全的解决方案,不需要任何自编方法。
答案 1 :(得分:1)
使用中间通配符进行转换可以完成转换。
List<Student> casted = (List<Student>)(List<?>) college.getList();
这更紧凑。但是,您的方法更加安全,因为这会导致未经检查的强制警告。
你的方法是最好的方法。
证明:List<Object>
可以包含扩展Object的对象。因此,如果要安全地进行转换,则应检查List中的每个对象是否为Student的实例。因此,您必须遍历所有列表。因此,在性能方面,你不能比遍历整个列表做得更好。