我在Java中的泛型测试不起作用!

Mat*_*zen 2 java compiler-construction generics

我正在做一些Java学习,特别是在泛型领域.

我对C#中的泛型非常熟悉,但在Java中,这是一个完全不同的故事.

我使用了一些适合测试的样本,我能够用Java复制我的大部分C#代码.

但是,当我尝试以下示例时,它不起作用:

private static <T> void swapKundeData(ArrayList<T> data, int index1, int index2) {

    T temporary = (T) data.get(index1);

    data.set(index1, data.get(index2)); //Does not compile
    data.set(index2, temporary); //Does not compile

}
Run Code Online (Sandbox Code Playgroud)

我收到的错误是:

在ArrayList类型中的方法set(int,capture#5-of?extends ExtendTest)不适用于参数(int,ExtendTest)

相当于这个在C#中运行得很好 - 所以发生了什么?

我已经读到Java在泛型方面受到了很多批评.这是批评的一部分吗?数据变量的Remove和Add方法工作得很好.

Gen*_*ges 6

好吧,我会用

List<Kunde> 
Run Code Online (Sandbox Code Playgroud)

代替

ArrayList<?>
Run Code Online (Sandbox Code Playgroud)

因为你无论如何都要去昆德:).

它不起作用的原因是您不知道传递的对象的类型.因此,如果您设置一个可能是错误类型的Kunde(因为使用ArrayList <?>,您可以传递ArrayList <String>并在其上设置Kunde将是错误的类型).

另一种可能性是:

private static <T> void swapData(List<T> data, int index1, int index2) {

    T temporary = data.get(index1);

    data.set(index1, data.get(index2)); //Does compile
    data.set(index2, temporary); //Does compile

}
Run Code Online (Sandbox Code Playgroud)

要完成我的咆哮,只需使用Collections的swap方法.

http://download.oracle.com/javase/1.4.2/docs/api/java/util/Collections.html#swap(java.util.List,int,int)