我目前正在攻读面向对象编程,我目前正在研究泛型一章.我有一个
Java类的以下代码,我要求做的是使最后一个方法calculateSquares通用.我真的很困惑,我可以告诉你.
这是班级:
public class OefeningWildcards {
public static void main(String[] args){
new OefeningWildcards().run();
}
public OefeningWildcards(){
}
public void run(){
Number[] numbers = {2, 3.1, 5, 12, 2.3};
List<Number> numbersList = new ArrayList<>();
for (Number n : numbers){
numbersList.add(n);
List<Number> dest = new ArrayList<>();
calculateSquares(dest, numbersList);
Double[] doubles = {3.2, 5.6, 4.4, 6.5, 12.2};
List<Double> doublesList = new ArrayList<>();
List<Number> dest2 = new ArrayList<>();
calculateSquares(dest2, doublesList);
List<Double> dest3 = new ArrayList<>();
calculateSquares(dest3, doublesList);
}
}
//This method needs to become generic
public void calculateSquares(List<Number> dest, List<Number> src){
dest.clear();
for (Number n : src) {
dest.add(n * n.intValue());
dest.add(n.doubleValue() * n.doubleValue());
}
}
我发现的是List Number需要成为List吗? extends Number,像这样:
public void calculateSquares(List<? extends Number> dest, List<? extends Number> src){
dest.clear();
for (Number n : src) {
dest.add(n * n.intValue());
dest.add(n.doubleValue() * n.doubleValue());
}
}
事情是,我不知道如何处理for循环:
for (Number n : src) {
dest.add(n * n.intValue());
dest.add(n.doubleValue() * n.doubleValue());
}
}
我的逻辑猜测是:
for (? extends Number n : src) {
dest.add(n * n.intValue());
dest.add(n.doubleValue() * n.doubleValue());
}
}
但这似乎是不正确的.我应该怎么做for循环?
最佳答案 你真正要求的是不可能的.至少你不能将目的地列表更改为?扩展数量.因为那时你不知道列表是哪种类型.如果是List< Integer>你不能在那里添加Double值.但是,您可以做的是使源通用.
要做的是将泛型类型添加到方法声明中
public void <T extends Number> calculateSquares(List<Number> dest, List<T> src){
dest.clear();
for (T n : src) {
dest.add(n * n.intValue());
dest.add(n.doubleValue() * n.doubleValue());
}
}
实际上,一旦离开目的地,您也可以离开旧方法.它仍然有效:
public void calculateSquares(List<Number> dest, List<? extends Number> src){
dest.clear();
for (Number n : src) {
dest.add(n * n.intValue());
dest.add(n.doubleValue() * n.doubleValue());
}
}
因为它似乎你想要添加一个List< Double>或列表< Number>到目的地.这可以通过改变第一个List并使用超级运算符再次实现:
public void calculateSquares(List<? super Double> dest, List<? extends Number> src){
dest.clear();
for (Number n : src) {
dest.add((double)n * n.intValue());
dest.add(n.doubleValue() * n.doubleValue());
}
}