Java: преобразовать int в объект типа T

поэтому у меня есть класс с именем ExpandableArrayList, который реализует ListInterface. Этот ArrayList заполнен экземплярами типа Item (он представляет мой универсальный тип T). class Item реализует Comparable и имеет следующие атрибуты: String itemNo, String itemName, двойная цена и целое количество.

Предполагается, что метод с именем CheckLimit в классе ExpandableArrayList проверяет, имеет ли какая-либо запись в списке количество ниже заданного предела или нет. Если это так, он удаляет его и вставляет в начало списка.

Я уже определил compareTo для класса Item на основе количества предметов, и это моя текущая реализация для checklimit:

 public void checkLimit (int limit){

/*Type conversions, change limit from int to Object and then to T,   
   in order to use CompareTo: */ 
 Object limitObj = (Integer)limit; 
 T limitT = (T)limitObj; 
 for ( int i=0 ; i< length ; i++ ) { 
    if ( limitT.compareTo(list[i]) > 0){ 

        /* ....... Remove and insert at front ......  */

    } // end if 
    } // end for   
 } // end checkLimit   

Он компилируется правильно, но вызывает исключение времени выполнения

Exception in thread "main" java.lang.ClassCastException:
 Item cannot be cast to java.lang.Integer  

Затем я попытался добавить следующий метод к элементу класса

 /* Added method ConvertToTypeT : 
this method is called by method checkLimit in class
ExpandableArrayList. it receives an integer and creates a temporary
Item Object having this integer as its quantity for comparision purpose only*/ 

public Item convertToTypeT(int limit) { 
  Item converted = new Item (" "," ",0.0,limit);
  return converted;                 } 

и изменил контрольный лимит на:

 public void checkLimit (int limit){
    for ( int i=0 ; i< length ; i++ ) {

    T  limitT =list[i].convertToTypeT(limit);
    if ( limitT.compareTo(list[i]) > 0){ 

        /* ....... Remove and insert at front ......  */

    } // end if 
    } // end for   
 } // end checkLimit  

но не работало даже после того, как я изменил общедоступный идентификатор

ExpandableArrayList.java:255: error: cannot find symbol
    T  limitT =list[i].convertToTypeT(limit);  
                      ^
symbol:   method convertToTypeT(int)
location: interface Comparable<CAP#1>
where T is a type-variable:
T extends Comparable<? super T> declared in class ExpandableArrayList
where CAP#1 is a fresh type-variable:
CAP#1 extends Object super: T from capture of ? super T

так есть ли правильный способ выполнить такое сравнение? учитывая, что заголовок checkLimit был указан в вопросе и его не следует менять (у него всегда должен быть аргумент int).

Спасибо заранее.


person java student    schedule 24.03.2015    source источник
comment
Item и Integer — совершенно разные объекты. Почему вы пытаетесь преобразовать Integer в Item? Примечание. Приведение не приводит к автоматическому преобразованию объекта в объект другого типа.   -  person Jesper    schedule 24.03.2015
comment
И еще одна тонкость: вы также не можете привести свой примитивный предел int к Integer.   -  person GhostCat    schedule 24.03.2015
comment
@Jesper да, я понял это, поэтому я использовал второй способ выше (добавляя метод, который создает элемент с ограничением в качестве его атрибута).   -  person java student    schedule 24.03.2015
comment
@pbabcdefp Упс; ты прав. Я предполагаю, что компилятор заменяет приведение на какой-то новый Integer() или Integer.valueOf()... интересно. Спасибо что подметил это!   -  person GhostCat    schedule 24.03.2015
comment
@EddyG это делается с помощью autoboxing.   -  person Jesper    schedule 24.03.2015
comment
@javastudent Если все, что вы знаете о T, это то, что он реализует Comparable<? super T>, то у вас нет способа добраться до quantity в классе Item, и тогда это будет сложно!   -  person Jesper    schedule 24.03.2015
comment
@Jesper «Автоупаковка» обозначает процесс, в котором компилятор что-то делает. Я имел в виду реализацию, которая делает что-то возможным.   -  person GhostCat    schedule 24.03.2015


Ответы (1)


Ошибка здесь, в вашем методе checkLimit:

T limitT = (T)limitObj; 

В этой строке вы пытаетесь привести limitObj, который является Integer, к типу T, который является Item. Вы не можете этого сделать — Integer — это объект совершенно другого типа, чем Item, нет способа преобразовать Integer в Item (и зачем, по-вашему, вам нужно это делать?).

Если вы хотите проверить значение quantity ваших объектов Item, сделайте следующее:

public void checkLimit(int limit) {
    for (int i = 0; i < length; i++) {
        if (list[i].quantity < limit) {
            // do whatever you need to do with list[i]
        }
    }
}

(list должен быть список Item объектов, чтобы это работало).

person Jesper    schedule 24.03.2015
comment
ну, я не должен настраивать класс ExpandableArrayList только для типа Item (написав list[i].quantity), класс должен работать для любого типа записей списка, так как он был написан автором книги, которую я изучаю, и я меня только попросили использовать его в моей программе. Спасибо хоть.. - person java student; 24.03.2015