簡體   English   中英

這是轉換ArrayList的好方法 <Object> 到ArrayList <MyObject> ?

[英]Is it a good way to cast ArrayList<Object> to ArrayList<MyObject>?

基於這個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");
}

我想在這里做的是通過從包含對象列表的大學對象接收通用的Student 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);
        }
    }
}

看起來正在工作,但問題是-將清單安全地投射到另一個清單上,這是最好的方法嗎?

使用番石榴:

List<Object> objects = Lists.newArrayList();
objects.add("A");
objects.add("B");
List<String> strings = FluentIterable.from(objects).filter(String.class).toList();

如果需要可變列表( ArrayList ),此示例將返回ImmutableList

List<String> strings = Lists.newArrayList(Iterables.filter(objects, String.class));

objects中不是String任何元素(在我的示例中)將被忽略。 這是一個完全類型安全的解決方案,不需要任何自寫方法。

使用中間通配符進行轉換可以完成轉換工作。

List<Student> casted = (List<Student>)(List<?>) college.getList();

這更緊湊。 但是,您的方法更安全,因為這會導致未經檢查的強制轉換警告。

您的方法是最好的方法。

證明List<Object>可以具有擴展Object的對象。 因此,如果您想安全地進行轉換,則應檢查List中的每個對象都是Student的實例。 因此,您必須遍歷所有列表。 因此,就性能而言,沒有比遍歷整個列表更好的了。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM