9

在选择正确的重载方法时,Java 通常更喜欢普通方法而不是泛型方法,这可能会生成以下sscce

public class GenericsTest {
    public static void main(String[] args) {
        myMethod(Integer.class, 10);
        myMethod(String.class, "overloaded method");
    }

    public static <T> void myMethod(Class<T> klass, T foo) {
        System.out.println("hello world");
    }

    public static <T> void myMethod(Class<T> klass, String bar) {
        System.out.println(bar);
    }
}

输出:

hello world
overloaded method

有没有办法强制 Java 使用通用版本?

4

4 回答 4

3

不,不只是删除或隐藏更具体的重载。然而,如果它们的行为不同,它们应该只是具有不同的名称。如果它们的行为相同,那么无论哪种方式都无关紧要。

于 2013-06-19T13:12:30.530 回答
1

我见过的一种方法是在不太常用的方法中添加一个虚拟参数:

public static <T> void myMethod(Class<T> klass, String bar, Void ignored) {
    System.out.println(bar);
}

称它为

myMethod(String.class, "overloaded method", null);

然而在其他方面

myMethod(String.class, "overloaded method");

调用泛型方法。

于 2013-06-19T13:11:08.323 回答
1

有没有办法强制 Java 使用通用版本?

并非没有删除、重命名或以其他方式更改第二种方法的签名。(如果你想变得更老套——不要这样做——使用反射来调用该方法。)这是因为Java 的重载解析过程会尝试选择它可以选择的最具体的方法。

15.12.2.5。选择最具体的方法

如果多个成员方法既可访问又适用于方法调用,则有必要选择一个为运行时方法分派提供描述符。Java 编程语言使用选择最具体方法的规则。

非正式的直觉是,如果第一个方法处理的任何调用可以传递给另一个方法而不会出现编译时类型错误,那么一个方法比另一个方法更具体。

于 2013-06-19T13:11:22.120 回答
1

泛型方法允许使用类型参数来表达方法和/或其返回类型的一个或多个参数的类型之间的依赖关系。如果不存在这样的依赖关系,则不应使用泛型方法。

(从这里

于 2013-06-19T13:13:56.973 回答