Java——泛型;如果你想交换一个对象的 2 个项目,参数化一个方法有用吗?

标签 java generics generic-method

以下代码允许交换对象的 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> ,所以你不能“交换”firstsecond 。编译器会拒绝该代码,因为不能保证这两种类型兼容。

关于Java——泛型;如果你想交换一个对象的 2 个项目,参数化一个方法有用吗?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/50933399/

相关文章:

vb.net - 带有泛型的 VB typeof 运算符

c# - 泛型方法以不同于泛型类型的方式处理 IEnumerable

Java 程序演示抽象 BankAccount 类和 SavingsAccount 子类

c# - 洗牌堆栈<T>

java - 为什么将 ArrayList 的泛型转换为父类(super class)不起作用?

scala - 如何在 Scala 中将泛型方法包装在泛型方法周围?

c# - 如何通过反射获取泛型参数的类型

java.lang.OutOfMemoryError Spark DAG 具有更多阶段

java - 如何使用 Java 中的 Aspose lib 将 Office 文件转换为 pdf

Java 多播套接字。如何停止/暂停 "receive"方法