java中的泛型如何适用于以下程序?

Sat*_*ash 18 java generics overloading

public class Program {

    private static <Program> void foo(Program x){
        System.out.println(x+"-->1");
    }

    private static void foo(final int i){
        System.out.println(i+"-->2");
    }

    public static void main(String[] args) {
        Integer i = 10;
        foo(i);
    }

}
Run Code Online (Sandbox Code Playgroud)

输出是:

10-->1
Run Code Online (Sandbox Code Playgroud)

我无法找到关于这个主题的任何相关讨论.但是,对不同主题的回答让我有点困惑: - 返回Java通用方法的类型

根据它们,泛型<Program>与返回类型无关,但在我的情况下,如果我稍微改变一下这个程序,那么输出就不同了.

public class Program {

    private static <Integer> void foo(Program x){
        System.out.println(x+"-->1");
    }

    private static void foo(final int i){
        System.out.println(i+"-->2");
    }

    public static void main(String[] args) {
        Integer i = 10;
        foo(i);
    }

}
Run Code Online (Sandbox Code Playgroud)

输出:

10-->2
Run Code Online (Sandbox Code Playgroud)

我正在使用JDK1.7

Ram*_*asi 14

在您的第一个示例中,您实际上并未指定类型的参数Program,它是通用的.该类型参数与您命名的类无关Program.通过这样的拼写错误,你会得到相同的结果:

public class Program {

    private static <Programmmm> void foo(Programmmm x){
        System.out.println(x+"-->1");
    }

    private static void foo(final int i){
        System.out.println(i+"-->2");
    }

    public static void main(String[] args) {
        Integer i = 10;
        foo(i);
    }

}
Run Code Online (Sandbox Code Playgroud)

但是,在第二个示例中,参数字面上是类型的Program,因此在调用时它不匹配,foo(10);并且您从第二个方法获得结果.


mat*_*att 13

在第一种情况下,Program是用于该方法的通用参数的名称.它可以是任何名称.重要的是method参数是一个Object,所以当你用Integer参数调用你的方法时,它会使用带Object的版本.

在第二种情况下,泛型参数被命名Integer(不要这样做),但方法采用的参数是程序.因此,通过使用Integer调用它,没有有效Object或整数版本,因此它将值取消装箱.

方法重载方面,它描述了解决重载的顺序.这将告诉你为什么第一个版本使用Object方法而不是int方法.

第二个问题是你已经将通用参数命名为具体类型,这令人困惑.如果你不这样做,会更容易看出来.

private static <T> void foo(T x){
    System.out.println(x+"-->1");
}
Run Code Online (Sandbox Code Playgroud)

现在它更清楚,T是一个参数化的参数.在你的第二个版本中,

private static <T> void foo(Program x){
    System.out.println(x+"-->1");
}
Run Code Online (Sandbox Code Playgroud)

现在很清楚,你的论证必须是一个Program对象,而不仅仅是任何对象.