使用java泛型的方法覆盖?

时间:2014-05-13 11:49:48

标签: java generics

在运行此代码时,我在评论的行上收到错误。所以请帮我解决一下我们如何使用java泛型重载函数的问题。

public class Main 
{
public static void main(String... args) 
{
    Main.<Integer>print();
    Main.<Short>print();//   error
    Main.<Byte>print();// error
    Main.<Void>print();//error
}

public static <T extends Integer> int print() 
{
    System.out.println("here - Integer");
    return 0;
}
public static <T extends Short> short print()  //error
{
    System.out.println("here - Short");
    return 0;
}
public static <T extends Byte> byte print() //error
{
    System.out.println("here - Byte");
    return 0;
}
public static <T extends Void> void print() //error
{
    System.out.println("here - Void");
}
}

4 个答案:

答案 0 :(得分:4)

尽管具有泛型类型参数,但这些方法并不是通用的。它们的签名也是一样的,java不能根据返回值区分函数。

你可能想要的是

public static <T> void print(T t) {
             System.out.println(t.getClass());
}
根据我的理解,它与您尝试实现的目标最接近。

另请查看oracle的generics documentation以了解泛型

答案 1 :(得分:1)

Java编译无法确定要调用的方法。因为返回类型不足以让编译决定调用谁。 带参数类型的重载功能。

检查以下代码:

public class Main 
{
    public static void main(String... args) 
    {
        Main.print();
        Main.print(1);//   int
        short s = 5;
        Main.print(s);// error
        byte b = 57;
        Main.print(b);//error
    }

    public static int print(int x) 
    {
        System.out.println("here - Integer :" + x);
        return 0;
    }
    public static short print(short y) 
    {
        System.out.println("here - Short :" + y);
        return 0;
    }
    public static byte print(byte b)
    {
        System.out.println("here - Byte :" + b);
        return 0;
    }
    public static void print()
    {
        System.out.println("here - Void");
    }
}

输出:

here - Void
here - Integer :1
here - Short :5
here - Byte :57

标记它^如果它对你有帮助......

谢谢,
拉夫

答案 2 :(得分:0)

您使用的代码错误 -

这篇文章很有用 http://javarevisited.blogspot.com/2011/09/generics-java-example-tutorial.html

一般来说,泛型只能在编译阶段工作而不是在运行时 - 所以你不能指望在这种情况下的polimorphism行为

答案 3 :(得分:0)

您的代码根本不需要泛型。从您的示例代码派生出来,您应该以这种方式重构它:

public static void main(String... args) {
    printInteger();
    printShort();
    printByte();
    print();
}

public static int printInteger() {
    System.out.println("here - Integer");
    return 0;
}

public static short printShort() {
    System.out.println("here - Short");
    return 0;
}

public static byte printByte() {
    System.out.println("here - Byte");
    return 0;
}

public static void print() {
    System.out.println("here - Void");
}

但为什么你一直都会回归0?如果要打印传递给print方法的值,请改为:

public static void main(String... args) {
    int i = 42;
    short s = 42;
    byte b = 42;
    print(i);
    print(s);
    print(b);
    print();
}

public static void print(int value) {
    System.out.println("here - Integer: " + value);
}

public static void print(short value) {
    System.out.println("here - Short: " + value);
}

public static void print(byte value) {
    System.out.println("here - Byte: " + value);
}

public static void print() {
    System.out.println("here - Void");
}