当前位置: 首页 > 面试题库 >

如何在Java中编写一个采用两个相同类型参数的通用方法?

程彭祖
2023-03-14
问题内容

当我发现以下代码在没有警告和打印的情况下进行编译时,我感到非常惊讶Integer / String

public final class GenericsTest {
    private static <T> void method(T arg1, T arg2) {
        System.out.println(arg1.getClass().getSimpleName());
        System.out.println(arg2.getClass().getSimpleName());
    }

    public static void main(String[] args) {
        method(1, "1");
    }
}

我预期会有编译错误。

编译该代码是否有原因?

确保参数具有相同类型的正确方法是什么?

编辑: 关于有限类型参数呢?我能想到的最好的是:

private static <T, U extends T> void method(T arg1, U arg2) {
    System.out.println(arg1.getClass().getSimpleName());
    System.out.println(arg2.getClass().getSimpleName());
}

不幸的是,java不允许循环约束。<T extends U, U extends T>不编译。这是死胡同吗?


问题答案:

究其原因,这是编译因为Java会推断出参数的最具体的超传入,在这种情况下,后是盒装,以和为传递。 Object Serializable & Comparable<? extends Serializable & Comparable<? extends Comparable<?>>>``1``Integer``"1"``String

没有泛型:

private static void method(Number arg1, Number arg2) {

即使没有泛型,也可以传入IntegerDouble

只有所涉及的类型是final,您才能在没有泛型的情况下执行此操作:

private static void method(String arg1, String arg2) {
    // Yes, they're both Strings, guaranteed.

我可以考虑使用泛型的一种极端情况,以确保它们是准确的类型。如果您有一个final班级,并且设置了一个上限,则可以将其限制为同一班级。

public <T extends MyFinalClass> void method(T arg1, T arg2) {
    // Yes, they're both MyFinalClasses
}

但是,如果没有泛型,您可以做同样的事情。

public void method(MyFinalClass arg1, MyFinalClass arg2) {
    // Yes, they're both MyFinalClasses
}


 类似资料:
  • 我的两个方法中的操作是相同的,但是输入参数类型不同,那么我该如何优化这两个方法,似乎没有那么重复?因为它们的操作是相同的,但参数类型不同,我该怎么做才能使这段代码更优雅呢?

  • 我想在调用方法中写的是这样的: 那么,我的接口应该是什么样子,以及如何将方法抽象为默认实现但可重写?

  • 问题内容: 我一直在四处张望,我至少找到了一个不清楚的答案。 我正在使用GUI构建一个非常基本的聊天应用程序,并且已经将GUI与连接对象分离了。现在,我需要在服务器类中从GUI调用一种方法,反之亦然。但是我不太了解如何做到这一点(即使使用“ this”也是如此)。这是一部分代码的样子(这是一个名为server_frame的类): 这是来自server_frame的代码,srv是另一个类(服务器)中

  • 在java中,我们可以缩小返回类型和throws异常类型(甚至删除throws子句): 但是,参数类型呢(如果A采用< code>T,那么为什么B不采用< code >?超级T)如: 让我们考虑一下我认为完全符合逻辑的这段代码: 所以我要说的是,在使用的代码上下文中仍然有效。

  • 我在Java中有两个几乎相同的方法。唯一的区别是它们有不同的参数类型。它们使用泛型并返回输入参数的类型T。我怎样才能摆脱重复的代码?下面是我的两个方法。最后,它们都使用不同的类型调用Spring。否则,方法是相同的。