2015-06-25 2 views
0

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

Я вызываю метод из другого класса ... Вот метод, который я вызываю.

public List<?> getPagedList() throws Exception; 

Когда я называю этот метод, как так

myList = (List<Trade>) getPagedList(); 

я получаю предупреждение о том, типобезопасности непроверенного броска.

Я попытался изменить способ этого

<T> T getPagedList(Class<T> myClass) throws Exception; 

Но я не могу показаться, чтобы получить объект класса из списка, как этот

getPagedList((List<Trade>).class 

Любые идеи или направления я могу начать обучение?

EDIT ---- Класс

public class Pagination{ 
    private static final int MAX_PAGE_LENGTH = 20; 
    private static final int MAX_PAGES = 5; 

    private int currentPage; 
    private List list; 

    public Pagination(List<?> list, String currentPage){ 
     this.list = list; 

     if(currentPage == null) 
      this.currentPage = 1; 
     else 
      this.currentPage = Integer.parseInt(currentPage); 
    } 

    public <T> List<T> getPagedList() throws Exception{ 
     if(currentPage * MAX_PAGE_LENGTH + MAX_PAGE_LENGTH > list.size()){ 
      return list.subList(currentPage*MAX_PAGE_LENGTH, list.size()); 
     }else{ 
      return list.subList(currentPage * MAX_PAGE_LENGTH, currentPage * MAX_PAGE_LENGTH + MAX_PAGE_LENGTH); 
     } 
    } 
} 

Мой Зов

List<Trade> ts = (Some Code to put objects in ts) 
    Pagination paging = new Pagination(ts, currentPage); 
    List<Trade> ts = paging.getPagedList(); 
+1

Что об этом? ' Список getPagedList() throws Exception;' и вызов его с помощью 'List trades = getPagedList()' – MT0

+0

Что-то здесь _going_ является небезопасным, если вы фактически не рассматриваете 'List ' как список, элементы которого имеют некоторые случайные неизвестный тип. –

+0

Тип предупреждения о безопасности здесь на самом деле говорит: «Я не несу ответственности за гарантию того, что это кастинг будет работать», но если вы знаете, что вы всегда будете передавать объект списка, это должно быть хорошо. Перед Java 1.5 существует много базового кода, который использовал такой тип кастинга, и они все еще работают даже после перехода на java 1.7. – ha9u63ar

ответ

1

Нет необходимости передавать параметр:

public class Pagination<T> { 

    private static final int MAX_PAGE_LENGTH = 20; 
    private static final int MAX_PAGES = 5; 

    private int currentPage; 
    private List<T> list; 

    public Pagination(List<T> list, String currentPage){ 
     this.list = list; 

     if (currentPage == null) 
      this.currentPage = 1; 
     else 
      this.currentPage = Integer.parseInt(currentPage); 
    } 

    public List<T> getPagedList() throws Exception { 
     if (currentPage * MAX_PAGE_LENGTH + MAX_PAGE_LENGTH > list.size()){ 
      return list.subList(currentPage * MAX_PAGE_LENGTH, list.size()); 
     } 
     return list.subList(currentPage * MAX_PAGE_LENGTH, currentPage * MAX_PAGE_LENGTH + MAX_PAGE_LENGTH); 
    } 
} 

не то, что вы хотите? «Магия» здесь состоит в том, чтобы иметь общий класс Pagination, где T является параметром того же типа во всем классе.

А вот как создать его экземпляр (ум оператора алмазной <>, который был введен в Java 7 и помогает уменьшить избыточную информацию):

Pagination<Trade> p = new Pagination<>(myListOfTrades, null); 
+0

Хм, хорошо, когда я это сделал, класс дал мне предупреждение, в котором говорилось, что мое объявление моего списка не было общим. Поэтому я попытался изменить класс на общий класс, используя открытый класс Pagination , а затем вызов нового метода с объявлением. Но я не мог заставить это работать. – Justin

+0

@ user3585563 Если вы публикуете то, что вы написали, возможно, я могу помочь. Я проверил код, который я написал, и я не получил никаких предупреждений компилятора. – Brian

+0

Я пошел вперед и обновил код, чтобы показать класс и вызов метода. Я просто получаю предупреждающие сообщения, и я знаю, что их можно исправить. Я просто хочу, чтобы у меня была возможность написать правильный путь :) – Justin

1

Вы можете сделать это

<T> List<T> getPagedList(Class<T> myClass) throws Exception; 

Это означает, вы можете передать тип элемента в качестве аргумента.

1

Чтобы расширить мой комментарий, вы можете использовать это как подпись метода:

<T> List<T> getPagedList(Class<T> type) throws Exception; 

И называть это так:

List<Trade> trades = getPagedList(Trade.class); 
Смежные вопросы