方法重载和泛型

时间:2013-06-19 13:04:09

标签: java generics overloading

在选择哪种重载方法正确时,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使用Generic版本?

4 个答案:

答案 0 :(得分:3)

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

答案 1 :(得分: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");

调用泛型方法。

答案 2 :(得分:1)

  

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

并非没有删除,重命名或其他方式更改第二种方法的签名。 (如果你想变得非常hacky - 不要这样做 - 使用反射来调用方法。)那是因为Java's overload resolution procedure会尝试pick the most-specific method it can.

  

15.12.2.5。选择最具体的方法

     

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

     

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

答案 3 :(得分:1)

通用方法允许使用类型参数来表示方法和/或其返回类型的一个或多个参数的类型之间的依赖关系。如果没有这种依赖关系,则不应使用通用方法。

(来自here