Java 声明一个ArrayList泛型有序列表,存放不同类型的对象

59 阅读1分钟
import java.util.ArrayList;

public class Demo2 {

    /*
    * 什么是泛型?
    * 1、泛型是一种模板,例如 ArrayList<T>,T 可以是任意类型
    *   ArrayList<String> names = new ArrayList<String>();
    *   然后由编译器针对类型做检查。
    *
    * 2、向上转型
    *   注意泛型的继承关系:可以把ArrayList<Integer>向上转型为List<Integer>(T不能变!),但不能把ArrayList<Integer>向上转型为ArrayList<Number>(T不能变成父类)。
    *   Number 是 float 的父类,如果转成number,那么就可以添加 浮点数,编译不会报错,但是获取值的时候就会报错。因为里面存在了 整形 和浮点型
    * */

    
    /*
    * 声明一个泛型列表,数组内可以存放任意类型的对象,因为 Object 是所有类的根类。
    * 但是注意:从ArrayList中检索元素是,此时得到的是 Object 类型,要进行类型转换。
    * */
    public static void main(String[] args) {
        ArrayList<Object> names = new ArrayList<>();
        Person p = new Person("chen",32);
        names.add("str");
        names.add(123);
        names.add(p);
        Object a = names.get(0);
        Object b = names.get(1);
        Object c = names.get(2);
        System.out.println(a);  // str
        System.out.println(b);  // 123
        System.out.println(c);  // com.fanxing.Person@1b6d3586,可以再利用反射获取到 Person 实例对象的 name,或者由Object转成实际类型

        // 从 ArrayList 中获取元素并进行类型转换。
        for(Object obj:names){
            if(obj instanceof String){
                String str = (String) obj;
                System.out.println("String: "+str);
            } else if (obj instanceof Integer) {
                Integer inte = (Integer) obj;
                System.out.println("Integer: "+inte);
            } else if (obj instanceof Person) {
                Person pp = (Person) obj;
                System.out.println(pp.getName());
            }
        }
    }


}

class Person{
    private String name;
    private int age;
    public Person(String name,int age){
        this.name = name;
        this.age = age;
    }
    public Person(){

    }

    public String getName() {
        return name;
    }

    public int getAge() {
        return age;
    }
}