在空列表中查找对象类型

时间:2016-06-22 13:33:24

标签: java list generics collections object-type

考虑以下情况。如何找到空列表采用哪种对象类型。

List<User> userList = new ArrayList();
List<Address> addList = new ArrayList();
method1(userList);
method1(addList);
void method1(List<?> list){
//Now list is empty;
//how to find list accepts User type object or Address type object
    }

2 个答案:

答案 0 :(得分:1)

这是不可能的。 Java在编译后删除了类型。

但你可以这样做:

<T> void method1(List<T> list, Class<T> tclass){
  // you force the class T as argument
}

调用“method1”有点不同。

List<User> userList = new ArrayList();
method1(userList, User.class);

答案 1 :(得分:0)

如果对象类型中包含通配符,则无法从空列表中获取对象类型。如果您传递空列表并尝试访问列表,则会出现NullPointerException。如果您传递空列表而不使用列表,则它将运行。通配符用于未知类型。如果您使用带通配符的列表,则将根据其包含的对象确定类型。如果list为空,则表示您无法获得有关其所属对象类型的任何信息。 这是一个例子,我传递包含元素的列表,我能够获得它所属列表的对象类型。 您可以使用类似的东西来获取对象类型。如果你不能那么请解释你的用例,这将有助于你。谢谢。

public class GenericsTest 
{
        List<User> userList = new ArrayList();
        User aa1 = new User(20, "Mine");
        User aa2 = new User(10, "Yours");
        userList.add(aa1);
        userList.add(aa2);
        List<Address> addList = new ArrayList();
        Address bb1 = new Address("20", "A B Road", "Kolkata");
        Address bb2 = new Address("10", "B C Roy Road", "KOlkata");

        addList.add(bb1);
        addList.add(bb2);

        method1(userList);
        method1(addList);
        method2(userList);
        method2(addList);
        public static void method1(List<?> list)
        {
            if(list.get(0) instanceof User)
            {
                System.out.println("I am User");
            }
            if(list.get(0) instanceof Address)
            {
                System.out.println("I am Address");
            }
        }
        public static void method2(List<?> list)
        {
            System.out.println("If you are not using list and have your own custom logic to find the type");
        }
}
class User
{

    int a1;
    String b1;
    public User(int a1, String b1) {

        this.a1 = a1;
        this.b1 = b1;
    }

}
class Address
{
    String line1;
    String line2;
    String line3;

    public Address(String line1, String line2, String line3) 
    {

        this.line1 = line1;
        this.line2 = line2;
        this.line3 = line3;
    }   
}