我想创建从数组中获取最大值的泛型方法。但是我遇到了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;
}
}
答案 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
只能包含Double
,Integer
等类,而不能包含double
,int
等原始类型。也许只需使用内置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. }));
}
}