【问题标题】:Method overriding using java generics? [duplicate]使用java泛型覆盖方法? [复制]
【发布时间】:2014-07-01 01:56:04
【问题描述】:

运行此代码时,我在已注释的行中遇到错误。所以请帮我解决这个问题,我们如何使用 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");
}
}

【问题讨论】:

  • 它还能编译吗?
  • 这不是方法覆盖。
  • 这是方法重载,是的
  • 由于泛型 docs.oracle.com/javase/tutorial/java/generics/erasure.html 的类型擦除,这不应该工作,因为运行时的方法签名将是相同的。
  • 该代码无法编译。一个类中可能没有两个具有相同名称和参数的方法。

标签: java generics


【解决方案1】:

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

你可能想要的是一个

public static <T> void print(T t) {
             System.out.println(t.getClass());
}

据我所知,这是最接近您想要实现的目标。

另外请看oracle的generics documentation了解泛型

【讨论】:

    【解决方案2】:

    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
    

    如果对你有帮助,请标记它...

    谢谢,
    高拉夫

    【讨论】:

      【解决方案3】:

      您的代码根本不需要泛型。从您的示例代码派生,您应该这样重构它:

      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");
      }
      

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多