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方法工作得很好.
好吧,我会用
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方法.