以下代码允许交换对象的 2 个项目:
public class Box<F, S> {
F first;
S second;
//Method to swap
public static <F> void swapItems(Box<F,F> box){
F temp = box.first;
box.first = box.second;
box.second = temp;
}
}
//The method could also be implemented like this:
void swapItems() {
F tmp1 = first;
S tmp2 = second;
first = (F) tmp2;
second = (S) tmp1;
}
通用代码的优点是什么?我就是不明白。 有人可以向我解释一下吗?如果我在 2 个对象上调用此方法,通用方法可能有用吗?
最佳答案
您的示例类实际上是泛型使用不当的一个很好的例子。通用Box
用于交换元素是建立在一个误解之上的。
Might the generic one be useful if i call this method on 2 objects?
没错(问题中的代码)。泛型不是为代码重用或构建代码而设计的。我们有相应的方法、包和模块。
支持交换顺序的两个项目的盒子,可以更好地实现如下(尽管我相信更合适的名称是 Pair
):
class Box<T> {
private T first;
private T second;
//2-parameter constructor
public void swapItems(){
T temp = first;
first = second;
second = temp;
}
//getters and setters
}
上面的类可以按如下方式使用:
Box<String> stringBox = new Box<>("first", "second");
String first = stringBox.getFirst();
String second = stringBox.getSecond();
或者如下:
Box<Integer> intBox = new Box<>(1, 2);
int first = intBox.getFirst();
int second = intBox.getSecond();
What is the advantage of the generic code?
假设您有一个与上面类似的类,那么泛型将允许您制作一个不同类型的盒子 <T>
,由编译器保证类型安全,正如两个示例所示:使用 Box
类定义一次,但与不同类型的“框项”一起使用,编译器知道这些类型并帮助验证类型。
例如,以下不正确的调用将会失败(继续上面的示例):
String third = intBox.getFirst();
这最后一个(不正确的)语句将在编译时失败,从而实现更快的反馈(与运行时的类转换异常相反)。
其他重要说明:
- 您的类声明了两个不同的类型参数,
<F, S>
,所以你不能“交换”first
和second
。编译器会拒绝该代码,因为不能保证这两种类型兼容。
关于Java——泛型;如果你想交换一个对象的 2 个项目,参数化一个方法有用吗?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/50933399/