2015-04-20 2 views
1

У меня возникла проблема с инициализацией списка. Класс элементов не известен во время компиляции - они могут быть int, float, string или custom classes.Инициализация общего списка в java

Так что я попытался это:

public class Sensordevice { 
    private List<?> valueList; 

    public void setValueList(List<?> valueList) { 
     this.valueList = valueList; 
    } 

    public void addValue(Object value) { 
     if(valueList == null){ 
      valueList = getList(value.getClass()); 
     } 
     valueList.add(value); 
    } 

    private <T> List<T> getList(Class<T> requiredType) { 
     return new ArrayList<T>(); 
    } 
} 

Но я получаю эту ошибку при valueList.add (значение) в AddValue Methode: (? Захвата # 4-в)

Метод добавить в списке типов не применяется для аргументов (Object)


Update

Большое спасибо за ваши ответы. Это решение работает для меня.

public class Sensordevice<T> { 
    private List<T> valueList; 

    public void setValueList(List<T> valueList) { 
     this.valueList = valueList; 
    } 

    public void addValue(T value) { 
     if(valueList == null){ 
      valueList = new ArrayList<T>(); 
     } 
     valueList.add(value); 
    } 
} 
+0

Там нет смысла создавать '' List если он объявлен как '' Список . – Bubletan

+2

Почему бы просто не использовать «Список '? – BretC

+0

Я бы посоветовал вам создать класс 'Sensordevice ' – sodik

ответ

1

Это работает для меня. И под «работами» я имею в виду, что я не получаю никаких ошибок. Кажется, он не предоставляет никаких функций, поскольку нет способа получить список объектов из Sensordevice, так как getList просто возвращает новый пустой список, но это код, который вы указали. Я думаю, что ядро ​​ошибки имеет addValue принимает Object вместо T.

public class Sensordevice { 
    private List valueList; 

    public <T> void setValueList(List<T> valueList) { 
     this.valueList = valueList; 
    } 

    public <T> void addValue(T value) { 
     if(valueList == null){ 
      valueList = getList(value.getClass()); 
     } 
     valueList.add(value); 
    } 

    private <T> List<T> getList(Class<T> requiredType) { 
     return new ArrayList<>(); 
    } 
} 

public static void main(String[] args) { 
    Sensordevice sd = new Sensordevice(); 
    sd.addValue(new Object()); 
    sd.addValue(new Integer(3)); 
    sd.addValue(""); 
    sd.addValue(new Sensordevice()); 

    System.out.println(sd.getList(Sensordevice.class)); 
} 
1

Так что, если вы не знаете конкретный типа вы бы использовать класс, сделать класс родовым:

public class Sensordevice<T> { 

    private List<T> valueList; 

    public void setValueList(List<T> valueList) { 
     this.valueList = valueList; 
    } 

    public void addValue(T value) { 
     if(valueList == null){ 
      valueList = getList(value.getClass()); 
     } 
     valueList.add(value); 
    } 

    private List<T> getList() { 
     return new ArrayList<T>(); 
    } 
} 
+0

Я думаю, что он * действительно * хочет иметь дело со списками разных типов, где тип не меняется от программы к программе, но во время фактического вычисления. –

+0

'getList (значение.getClass()); '' private List getList() 'он работает? – haifzhan

+0

@ AndreyTyukin тогда ему нужен 'List ' просто unparametrized 'List' –

0

Если вы не знаете типа List вы можете оставить его без каких-либо указаний типа , только что положите: private List valueList;

+1

Это разрешено * снова *? Я думал, что они устарели от него, по крайней мере, с 1,5? Может быть, они по какой-то причине представили его, я не уверен. Где-то между 1.5 и 1.6, конечно, вы получите предупреждения компилятора. –

+0

@ АндрюТюкин не рекомендуется, BTW по-прежнему широко используется в источниках Java SE. Некоторые библиотеки заполнены '@SupressWarnings (« rawtypes »)' –

+0

@SashaSalauyou Я предполагаю, что эти библиотеки были grandfathered. Есть ли библиотеки, написанные за последние пять лет, которые используют сырые типы? – Andreas

0

Изменить valueList на: частный Список valueList; и getList() к:

private <T> List<Object> getList(Class<T> requiredType) { 
     return new ArrayList<Object>(); 
    } 

Это исправляет ошибку, и это, кажется, работает правильно. Я тестировал его со строками, поплавками и ints.

+1

, если 'List ' всегда возвращается, что цель 'requiredType' вообще? –

+0

Это должен быть список , чтобы удовлетворить 'private List valueList;' Вы можете сохранить свой getList так, как он есть, и сделать «valueList = (List ) getList (value.getClass()); в 'addValue', но это даст вам предупреждение о безопасности. – Forseth11

+0

Если это так, достаточно простого 'getList()'. –

0

В настоящее время я не вижу каких-либо преимуществ в использовании List<?> вместо Object. Чтобы добавить что-то в список, вам нужно что-то вроде List<? super Object>, но это is точно так же, как List<Object>. Таким образом, вы можете забыть подстановочные знаки и работать с простым List<Object>. Это не очень безопасно, однако:

import java.util.*; 

public class SensorDevice { 
    private List<Object> valueList; 

    public void setValueList(List<?> valueList) { 
     this.valueList = (List<Object>)valueList; 
    } 

    public void addValue(Object value) { 
     if(valueList == null){ 
      valueList = getList(); 
     } 
     valueList.add(value); 
    } 

    private List<Object> getList() { 
     return new ArrayList<Object>(); 
    } 


    //** <REMOVE> 
    public static void main(String[] args) { 
     List<Integer> ints = new LinkedList<Integer>(); 
     ints.add(5); ints.add(7); ints.add(9); 
     SensorDevice device = new SensorDevice(); 
     device.setValueList(ints); 
     device.addValue(17); 

     // this works too, however... 
     device.addValue("hello"); 
    } 

    // </REMOVE> */ 
} 
Смежные вопросы