2013-04-10 5 views
1

Что не так с listNum.add (num) в коде ниже; (Справочно http://docs.oracle.com/javase/tutorial/java/generics/lowerBounded.html)Generics Java super

дает ошибку компиляции, как метод надстройку (захват # 1-о? Супер Long) в списке типов не применяется для аргументов (номер)

public class GenericSuper { 

    List<? super Long> listNum = new LinkedList <Number>(); 
    List<? super ExportException> listExp= new LinkedList<RemoteException>(); 

    public List<? super ExportException> addList() 
    { 
     Number num = 10; 
     listNum.add(num); 
     RemoteException rme = new RemoteException(); 
     listExp.add(rme); 
     return rme; 
    } 
} 
+5

Почему вы не просто объявляете 'listExp' как' List 'и' listNum' как 'List '? Я подозреваю, что вы должны вернуться к тому, что означают ограниченные подстановочные знаки. –

+0

Я хочу хранить все суперклассы long в listNum и ExportException в listExp. И, следовательно, после прочтения ссылки, как показано выше в запросе. Я попытался использовать нижнюю ограниченную дикую карту. Пожалуйста, предложите правильное понимание со ссылками и примером. –

+0

Но 'List 'означает" список какого-либо типа Long или суперкласс, но я не знаю, что "- это означает, что вы не можете добавить к нему' Number'. (Возможно, он был создан как «ArrayList », который не должен содержать недолго.) –

ответ

1

listNum может быть экземпляром List<Long>, и вы не можете добавить Number в список Long, так как это приведет к исключению класса cast.

Решения:

  1. делают listNumList<? super Number>
  2. сделать numLong
+0

В этом примере следует понимать правильное использование нижнего ограниченного шаблона. Ссылка ссылка вставляется в запрос выше. Я хочу сохранить все суперклассы, например, ExportException в списке. Могу ли я это сделать? Является ли приведенный выше пример правильным способом тестирования? Я ошибаюсь в своем понимании нижнего ограниченного шаблона? –

+0

спасибо Jon Skeet за подсказку, я написал этот код, чтобы уточнить использование Super с Generics. Комментарии объясняют все это. –

0
package main.java.com.mysystems.generics; 

import java.rmi.RemoteException; 
import java.rmi.server.ExportException; 
import java.rmi.server.SocketSecurityException; 
import java.util.LinkedList; 
import java.util.List; 

//peCS 
//Consumer super- you want to add item i.e of super type to the collection. 
public class GenericSuper { 


    List<? super Long> listNum = new LinkedList <Number>();// listNum is variable that can be assigned list of type super class to Long. 
    //And you can put Long and its subclass. And you can only get Object type since it can hold anything from Long to Object. 

    List<? super ExportException> listExp= new LinkedList<RemoteException>(); // listExp is variable that can be assigned any list of type super class to ExportException. 
    // And you can put ExportException and all subclasses of ExportException to the list. And you can only get Object type since it can hold anything from ExportException to Object. 

    public List<? super ExportException> addList() 
    { 
     LinkedList <Number> numList = new LinkedList <Number>(); 

     Number num = 10.10; 
     numList.add(num); 
     listNum = numList; 
     //listNum.add(num); //Compilation error as only long or its subclass can be added. 
     listNum.add(20L); 

     for(Object e:listNum){ // Note you can only get Object type and will have to use instance of to do anything meaningful. 
      System.out.println(e); 
     } 
     SocketSecurityException sse = new SocketSecurityException("Hello"); 
     listExp.add(sse); 
     return listExp; 
     } 
    } 
0

Проблема не с реализацией дженериков, а его основной Java Collection рамки ошибка в которой вы не можете добавить Номер тип до Long type.Generics просто разрешает его во время компиляции. Если бы дженерики не были в этом месте, у вас было бы исключение времени выполнения, то есть ClassCastException.