Java泛型:“核心Java”教程的解决方案不适用于Eclipse?

Java泛型:“核心Java”教程的解决方案不适用于Eclipse?,java,eclipse,generics,Java,Eclipse,Generics,我正在读霍茨曼和康奈尔的《核心Java》第一卷。 在泛型一章中,他们建议一个故意错误的输入,以便了解编译器所说的内容。我的问题是:不仅编译器没有给我相同的错误,而且当我按照书中的说明更正输入时,它还会继续给我错误。交易如下: public class PairTest1 { public static void main(String[] args) { double middle = ArrayAlg.getMiddle(3.14, 1729, 0); } }

我正在读霍茨曼和康奈尔的《核心Java》第一卷。 在泛型一章中,他们建议一个故意错误的输入,以便了解编译器所说的内容。我的问题是:不仅编译器没有给我相同的错误,而且当我按照书中的说明更正输入时,它还会继续给我错误。交易如下:

public class PairTest1 {
    public static void main(String[] args) {
        double middle = ArrayAlg.getMiddle(3.14, 1729, 0);
    }
}

class ArrayAlg {
    public static <T> T getMiddle(T[] a) {
        return a[a.length / 2];
    }
}
书上说我应该得到错误:

找到:java.lang.Number&java.lang.Compariable>,必需:双精度

相反,Eclipse不允许我运行该程序

类型ArrayAG中的方法getMiddleT[]不适用于 参数是double,int,int

然后书上说

补救方法是将所有参数写入双值

因此,我将1729更改为1729.1,将0更改为0.1。现在Eclipse说:

类型ArrayAG中的方法getMiddleT[]不适用于 论点是双重的,双重的,双重的

嗯。。。我不知道发生了什么事。建议

谢谢和问候


编辑:我试图创建数组double[]doubles={3.141729.1,0.1};并将其作为参数,但现在我得到了一个错误,类型ArrayAlg中的getMiddleT[]方法不适用于参数double[]

函数需要一个数组,但您将传递3个单独的double参数。

您应该将调用更改为

double middle = ArrayAlg.getMiddle(new Double[]{ 3.14, 1729.0, 0.0 });
如果您想以您现在的方式传递它们,那么您应该将声明更改为

public static <T> T getMiddle(T... a)
{
    return a[a.length / 2];
}

这本书使用的是什么版本的JDK?你用的是什么版本?这本书使用Eclipse吗?太好了,它很有效还有一个问题:我试图改变我在编辑中所做的,用Double[]Double代替Double[]Double。就这样,它成功了。这是否意味着在对基元类型使用泛型时,我必须始终使用包装器?您应该能够使用像getMiddle3.14d、1729.0d、0.0d这样的调用;是的,如果使用数组,则必须使用包装器,因为基元类型的数组不会自动装箱到对应包装器类的数组。
double middle = ArrayAlg.getMiddle(3.14, 1729.0, 0.0);