Как созданный метод с подписью как Список

Я очень плохо знаком с языком программирования Java, таким образом, это - вероятно, немой вопрос, но я должен спросить это, потому что я не могу понять это самостоятельно. Вот соглашение.

Я хочу создать метод, который извлекает определенный тип объекта из списка. Таким образом, метод должен получить Список как аргумент, означая, что список должен содержать или Object1 или Object2. Я попробовал как это:

   public Object1 extractObject(List<Object>){
    //some pseudo-code 
   ... loop trough list and check if list item is instance of object one return that instance
    }

Проблема с методом объявления с List<?> поскольку аргумент метода - то, что я получаю ошибку компиляции от затмения Syntax error on token ">", VariableDeclaratorId expected after this token.

Как я устанавливаю сигнатуру метода правильно для принятия типов объектов или Object1 или Object2?Спасибо

Это - мой Код:

protected Object1 getObject1(List<Object> list){
        for(Object obj : list) {
            if(obj instanceof Object1) {
                return (Object1) obj;
            }
        }
        return null;
    }

Редактирование - что является различием между этими 2:

public Object1 getObject1(List<Object> list){
        for(Object obj : list) {
            if(obj instanceof Object1) {
                return (Object1) obj;
            }
        }
        return null;
    }

public Object1 extractObject(List<Object> list, Class<Object1> type) {
    for(Object obj : list) {
        if(type.isInstance(obj)) {
            return (Object1)obj;
        }
    }
    return null; // no match found
}
5
задан mdma 17 May 2010 в 15:38
поделиться

4 ответа

public Object1 extractObject(List<?> list){
    //some pseudo-code 
   ... loop trough list and check if list item is instance of object one return that instance
    return null;
}

Вам нужна переменная для вашего экземпляра

И возврат.

3
ответ дан 14 December 2019 в 19:05
поделиться

Я бы сделал что-то вроде этого - обратите внимание, мой синтаксис может быть неправильным, но идея заключается в тем же.

// this works for any type - just pass in an Object1
public Object extractObject(List<?> list, Class clazz) {
    for(Object obj : list) {
        if(obj.getClass().equals(clazz) {
            return obj;
        }
    }
    return null; // no match found
}

И не общий:

// this works for just one type
public Object1 extractObject(List<?> list) {
    for(Object obj : list) {
        if(obj.getClass().equals(Object1) {
            return obj;
        }
    }
    return null; // no match found
}

Тестировал концепции с помощью этого драйвера:

public static void main(String[] args) {
    Class c = "".getClass();
    if("".getClass().equals(c)) System.out.println("true");
    else System.out.println("false");
}

Из комментариев рассмотрите также clazz.isAssignableFrom (otherClazz) .

1
ответ дан 14 December 2019 в 19:05
поделиться

Между ними нет никакой разницы. Согласно javadoc, Этот метод является динамическим эквивалентом оператора instanceof языка Java.

0
ответ дан 14 December 2019 в 19:05
поделиться

Поскольку вы используете дженерики, вы можете сделать

public <T> T extractObject(List<?> list, Class<T> type) {
    for(Object obj : list) {
        if(type.isInstance(obj)) {
            return (T)obj;
        }
    }
    return null; // no match found
}

Это сделает возвращаемый тип вашего метода таким же, как искомый тип.

Благодаря generics мы можем использовать один и тот же метод для извлечения различных типов объектов:

Object1 object1 = extractObject(list, Object1.class);
Object2 object2 = extractObject(list, Object2.class);

Это предпочтительнее, чем жестко кодировать проверку типа с помощью obj instanceof Object1, поскольку это привело бы к необходимости использования отдельного метода для каждого типа, все они почти идентичны, кроме возвращаемого типа и проверки instanceof.

1
ответ дан 14 December 2019 в 19:05
поделиться
Другие вопросы по тегам:

Похожие вопросы: