Найти тип объекта в пустом списке

рассмотрим приведенную ниже ситуацию. Как узнать, какой тип объекта принимает пустой список.

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
    }

person gauti    schedule 22.06.2016    source источник
comment
Вы не можете - см. стирание типа.   -  person Sean Bright    schedule 22.06.2016
comment
Вы можете передать тип вместе со списком: <T> void method1(List<T> list, Class<T> cls) {...}   -  person Jorn Vernee    schedule 22.06.2016
comment
Вы не сможете увидеть, пока не создадите свой собственный список, который даст вам необходимую информацию о типе. Здесь уже есть ответ   -  person SomeDude    schedule 22.06.2016


Ответы (2)


Это невозможно. 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);
person Troncador    schedule 23.06.2016

Вы никак не можете получить тип объекта из пустого списка, если в нем есть подстановочный знак. Если вы передаете пустой список и пытаетесь получить доступ к списку, тогда придет исключение NullPointerException. Если вы передаете пустой список и не используете его, он будет запущен. Подстановочный знак используется для неизвестного типа. Если вы используете список с подстановочными знаками, то тип будет определяться на основе содержащегося в нем объекта. Если список пуст, это означает, что у вас не может быть никакой информации о типе объекта, к которому он принадлежит. Вот пример, когда я передаю список, содержащий элемент, и я могу получить тип объекта списка, к которому он принадлежит. Вы можете использовать что-то подобное, чтобы получить тип объекта. Если вы не можете, объясните свой вариант использования, который поможет вам. Спасибо.

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;
    }   
}
person RCS    schedule 24.06.2016
comment
` public static void method1(List‹?› list) { // Я хочу добавить новый объект User, на случай, если придет userList, а затем передать список другому методу method2(list); }` это возможно или здесь есть другой способ. - person gauti; 30.06.2016
comment
Да, вы можете добавить любой объект в список, поскольку в нем есть подстановочный знак, а затем вы можете передать этот список любому другому методу. Другой метод, который будет использовать список, должен иметь возможность обрабатывать список на основе содержащегося в нем объекта. - person RCS; 30.06.2016