Я очень плохо знаком с языком программирования 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
}
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;
}
Вам нужна переменная для вашего экземпляра
И возврат.
Я бы сделал что-то вроде этого - обратите внимание, мой синтаксис может быть неправильным, но идея заключается в тем же.
// 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) .
Между ними нет никакой разницы. Согласно javadoc, Этот метод является динамическим эквивалентом оператора instanceof языка Java.
Поскольку вы используете дженерики, вы можете сделать
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.