java:将int转换为T类型的对象

时间:2015-03-24 10:52:39

标签: java comparison comparable compareto

所以我有一个名为 ExpandableArrayList 的类,它实现了 ListInterface 。此ArrayList填充了 Item 类型的实例(它代表我的泛型类型T)。 class Item 实现Comparable ,并具有以下属性:String itemNo,String itemName,double price和int quantity。

名为 CheckLimit 的方法在类ExpandableArrayList中,应检查列表中的任何条目是否具有低于给定限制的数量。如果是,则将其删除并将其插入列表的前面。

我已经根据物品数量为类物品定义了 compareTo , 这是我目前对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;                 } 

并将checklimit更改为:

 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参数)。

非常感谢提前。

1 个答案:

答案 0 :(得分:0)

此问题出现在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对象的列表才能实现此目的。)