2015-10-11 42 views
1

我不断收到一条消息,告诉我运营商<对于T,T类型未定义。这发生在查找通用ArrayList中的最小值

if(index<lowest) 

我该如何去修改我的程序,以便我可以使用泛型方法获取数组列表的最小值和最大值?

package p07; 

import java.util.ArrayList; 

public class MyList<T extends Number> { 
    private ArrayList<T> l; 

    public MyList(ArrayList<T> l) { 
     this.l=l; 
    } 
    public void add(T x) { 
     l.add(x); 
    } 
    public static <T> void smallest(ArrayList<T> l) { 
     T lowest=l.get(0); 
     for(T index:l) { 
      if(index<lowest) { 

      } 
     } 
    } 
} 
+0

你不能使用Math.max()吗? – Pavan

+0

我不相信我们被允许使用它 – Matt

+0

然后,您可能需要使用自己的可比较的接口实现并使用api,如Collections.min/Collections.max – Pavan

回答

-1

编译器是正确的:运算符<只适用于原始数值类型。引述JLS的section 15.20.1

类型每一个数值比较操作符的操作数必须是一种类型的可转换(§5.1.8)为原始数字类型,或编译时发生错误。

因此,不是为对象,即使不为数字定义,因为它们不能被取消装箱于基本类型:所述JLS的section 5.1.8

A型被认为是可转换为一个数字类型(如果它是数字类型(§4.2)),或者它是可以通过拆箱转换转换为数字类型的引用类型。

你需要的是使用Comparator或使对象ComparableComparator s负责比较相同类型的两个对象。由于这里的对象是数字,他们是不是Comparable,您需要使用自定义Comparator,像这样:

Comparator<Number> myComparator = new Comparator<Number>() { 
    @Override 
    public int compareTo(Number n1, Number n2) { 
     // implement logic here. 
     // Return -1 if n1 < n2, 0 if n1 = n2, 1 if n1 > n2 
    } 
}; 

然后你可以使用这个比较是这样的:

public static <T extends Number> T smallest(List<T> l) { 
    T lowest = l.get(0); 
    for (T index : l) { 
     if (myComparator.compareTo(index, lowest) < 0) { 
      index = lowest; 
     } 
    } 
    return lowest; 
} 

(请注意,我将T extends Number添加到方法的类型 - 这是因为该方法是静态的,所以实际上声明了另一个类型为T的类)。

+0

问题是,我试图做的问题只是希望我将程序限制在Numbers的上限 – Matt

+0

@Matt您需要实现一个“比较器”,就像我在我的答案中提到的那样。 – Tunaki

+0

谢谢你的帮助。我只记得方法可以实现可比较接口 – Matt

-1

这里有几个错误,但让我们从低悬的语法水果开始。

算术运算符为原始值的工作,T非常多的Object,所以你不能就能够在这里使用。

另一个细微差别你的语法是,你T为静态函数是不一样与之结合上您的课T

可以解决这个问题,无论是通过添加约束自己......

public static <T extends Number> void smallest(ArrayList<T> l) 

...但是这使我要问,为什么你想这个方法是静态的呢?

你模糊的领域l的名称与参数l,因此,尽管你可能会认为这是要为实例作品的提供l,它不会因为方法本身声明static,和你如果不是这样的话,它仍然会掩盖该领域的名字。

你应该做的是从该方法中删除static,并从函数中删除该参数。

public void smallest() {} 

但现在,你有一个问题,在你实际上并不回报最小的值是什么。你应该回到它,而不是什么:

public T smallest() {} 

获得的最后一个值了数组很简单,如果你有能力进行排序的。你只需要确保你的所有元素都是Comparable,这样就可以对它们进行排序,并且你最关心的值 - 如Integer,Double,Float,Long

public class MyList<T extends Number & Comparable<T>> {} 

如果可以进行排序,然后让最小的是简单

public T smallest() { 
    // Don't mutate the order of the original array. 
    ArrayList<T> listCopy = new ArrayList<>(l); 
    Collections.sort(listCopy); 
    return listCopy.get(0); 
} 

通过这种方法,我离开作为练习读者获得最高的。

+0

这是错误的。我们不能认为OP的'Number'是'Comparable'。也许他想比较'class Fraction extends Number',他不能改变'Fraction'。 – Tunaki

+0

从根本上说,有一个不是“Comparable”的'Number'是没有意义的,但我们必须看看实际需求是什么。对于这个函数为什么是静态的,以及他们实际实现的是什么'Number',仍然存在很多模糊和混淆。我强烈怀疑他们使用任何自定义的'Number'类 - 这看起来像一个简单的任务 - 所以除非OP确实说他们正在使用它,那么我不会那么快地说这是“错误的” 。 – Makoto

+0

如果'Number'不是'Comparable',那么'Number'将实现'Comparable'。看起来你不同意这个班是如何设计的。问题中没有含糊不清(除了整个静态的东西,可能是一个错字):'T扩展数字',就这些。 – Tunaki