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()
方法,这样当列表包含浮点数时,就不会丢失精度。另一方面,包含大数字的整型或长型列表将使它们的精度降低一倍。