在可转换的铸造中,从T铸造到双

时间:2014-03-06 07:48:35

标签: java generics

我想创建从数组中获取最大值的泛型方法。但是我遇到了T与Math.max方法之间的转换问题。

这是我的代码: 首先,我无法初始化maxValue,如:

T maxVaue = 0;

其次我不能在Math.max中使用data [i],在这两种情况下我都遇到了In convertible cast的错误。

class Matrix<T>{
    public T getMaxValue(T[] data){
        T maxValue;
        for (int i=0; i<data.length; i++){
            maxValue = Math.max(data[i], maxValue);
        }
        return maxValue;
    }
}

3 个答案:

答案 0 :(得分:3)

Math.max只接受int,float,double和long。因此,您无法将其与T一起使用。

您可以使用T编写自己的max()方法。例如,您的方法可以在param中使用Comparator对象。或者你的T对象可以实现Comparable接口。

看一下这篇文章:How to implement a generic `max(Comparable a, Comparable b)` function in Java?

答案 1 :(得分:2)

你不能这样做,因为T可以是任何东西。你可以,例如将T限制为Number,但是您必须选择中间基元类型,但仍会遇到返回值的问题。

但是,您可以将T限制为Comparable并使用它,例如:

class Matrix<T extends Comparable<T>>{
    public T getMaxValue(T[] data){
        T maxValue = null;
        for (int i=0; i<data.length; i++){
            if (maxValue == null || data[i].compareTo(maxValue) > 0)
                maxValue = data[i];
        }
        return maxValue;
    }
}

所有Java的原始包装类型都实现了Comparable,以及许多其他类型:

byte by = new Matrix<Byte>().getMaxValue(new Byte[]{1, 2, 3});
char ch = new Matrix<Character>().getMaxValue(new Character[]{'a', 'b', 'c'});
int in = new Matrix<Integer>().getMaxValue(new Integer[]{1, 2, 3});
short sh = new Matrix<Short>().getMaxValue(new Short[]{1, 2, 3});
long lo = new Matrix<Long>().getMaxValue(new Long[]{1L, 2L, 3L});
float fl = new Matrix<Float>().getMaxValue(new Float[]{0.1f, 0.2f, 0.3f});
double db = new Matrix<Double>().getMaxValue(new Double[]{0.1, 0.2, 0.3});
boolean bo = new Matrix<Boolean>().getMaxValue(new Boolean[]{false, true});
String st = new Matrix<String>().getMaxValue(new String[]{"turtles", "are", "weird"});
BigInteger bi = new Matrix<BigInteger>().getMaxValue(new BigInteger[]{...});

答案 2 :(得分:2)

T只能包含DoubleInteger等类,而不能包含doubleint等原始类型。也许只需使用内置Collections.max(Collection<T extends Comparable<T>>)Doubles数组而不是doubles,就像在此代码示例中一样

class Matrix<T extends Comparable<T>> {
    public T getMaxValue(T[] data) {
        return Collections.max(Arrays.asList(data));
    }

    public static void main(String[] args) throws IOException {
        Matrix<Double> m = new Matrix<>();
        System.out.println(m.getMaxValue(new Double[] { 1., 42., 3., 4., 5. }));
    }
}
相关问题