Java 错误:不兼容的类型:无法将U转换为int
我有以下程序Java 错误:不兼容的类型:无法将U转换为int,java,generics,Java,Generics,我有以下程序 import java.util.*; public class Solution { public static <U extends Number> double median(List<U> l) { double Q = 0; int n = l.size(); if (n%2 == 0) { Q = ((int)l.get(n/2) + (int)l.get(
import java.util.*;
public class Solution {
public static <U extends Number> double median(List<U> l) {
double Q = 0;
int n = l.size();
if (n%2 == 0) {
Q = ((int)l.get(n/2) + (int)l.get(n/2-1)) / (double)2;
} else {
Q = new Double((int)l.get(n/2));
}
return Q;
}
public static void main(String[] args) {
Scanner sc = new Scanner(System.in);
int n = sc.nextInt();
List<Integer> l = new ArrayList<>();
for (int i = 0; i < n; i++){
l.add(sc.nextInt());
}
Collections.sort(l);
double Q1 = 0, Q2 = 0, Q3 = 0;
List<Integer> lower = new ArrayList<>();
List<Integer> upper = new ArrayList<>();
if (n%2 == 0) {
lower.addAll(l.subList(0, n/2));
upper.addAll(l.subList(n/2, n));
} else {
lower.addAll(l.subList(0, n/2));
upper.addAll(l.subList(n/2 + 1, n));
}
Q2 = median(l);
Q1 = median(lower);
Q3 = median(upper);
System.out.format("%.0f%n", Q1);
System.out.format("%.0f%n", Q2);
System.out.format("%.0f%n", Q3);
sc.close();
}
}
import java.util.*;
公共类解决方案{
公共静态双中位数(列表l){
双Q=0;
int n=l.size();
如果(n%2==0){
Q=((int)l.get(n/2)+(int)l.get(n/2-1))/(double)2;
}否则{
Q=新的双精度((int)l.get(n/2));
}
返回Q;
}
公共静态void main(字符串[]args){
扫描仪sc=新的扫描仪(System.in);
int n=sc.nextInt();
列表l=新的ArrayList();
对于(int i=0;i
当我试图从eclipse运行它时,它可以很好地编译并在我的本地机器上运行,但是当我将它提交给hackerrank时,我得到了以下编译错误
Solution.java:12: error: incompatible types: U cannot be converted to int
Q = ((int)l.get(n/2) + (int)l.get(n/2-1)) / (double)2;
^
where U is a type-variable:
U extends Number declared in method <U>median(List<U>)
Solution.java:12: error: incompatible types: U cannot be converted to int
Q = ((int)l.get(n/2) + (int)l.get(n/2-1)) / (double)2;
^
where U is a type-variable:
U extends Number declared in method <U>median(List<U>)
Solution.java:14: error: incompatible types: U cannot be converted to int
Q = new Double((int)l.get(n/2));
^
where U is a type-variable:
U extends Number declared in method <U>median(List<U>)
3 errors
Solution.java:12:错误:不兼容的类型:无法将U转换为int
Q=((int)l.get(n/2)+(int)l.get(n/2-1))/(double)2;
^
其中U是一个类型变量:
U扩展方法中值(列表)中声明的数字
Solution.java:12:错误:不兼容的类型:无法将U转换为int
Q=((int)l.get(n/2)+(int)l.get(n/2-1))/(double)2;
^
其中U是一个类型变量:
U扩展方法中值(列表)中声明的数字
Solution.java:14:错误:不兼容的类型:无法将U转换为int
Q=新的双精度((int)l.get(n/2));
^
其中U是一个类型变量:
U扩展方法中值(列表)中声明的数字
3个错误
我甚至不明白为什么我必须将每个列表元素转换回int,我想既然U扩展了Number,我应该能够添加列表元素而不必转换回int。关于泛型有什么我不理解的吗?Q1、Q2、Q3保证为整数(但这只是因为输入测试用例),但这不重要,为什么我的程序没有编译?如果将列表项强制转换为整数,为什么要将中值方法声明为泛型
将其更改为
public static double median(列表l)
并删除所有对int的强制转换。您可以调用Number
元素上的intValue()
方法,而不是将它们强制转换为int
()嗯
U扩展了数字
,所以List
可以是一个列表
。但它也可以是列表
,或列表
,等等。。。如果将列表
或列表
传递给该方法,该怎么办?为什么还要在这里应用泛型?似乎是强制的,所以我不能用同样的方法来求一系列双精度、浮点数或大整数的中值?好吧,我不会强制转换为int,但它应该可以正常工作?我应该能够找到中位数,即使是双打名单。或浮动,或任何其他数据类型。如果删除(int)铸件,代码将无法编译。因为它不能添加类型为UYou的元素,所以可以执行l.get(i).doubleValue()而不是强制转换。我是否可以使用此方法查找浮点列表或双精度列表的中位数?是的,它也适用于浮点列表或双精度列表,但数字将四舍五入。如果要将中值返回为双精度,最好使用doubleValue()
方法,这样当列表包含浮点数时,就不会丢失精度。另一方面,包含大数字的整型或长型列表将使它们的精度降低一倍。