你能用泛型进行方法重载,只改变方法签名的泛型类型吗?

时间:2011-08-29 03:28:50

标签: java oop generics overloading

如果你不使用Java Generics,我相信在同一个类中只有两个方法不同,它们的返回类型不同。

换句话说,这将是非法

public HappyEmotion foo(T emotion) {
    // do something
}   

public SadEmotion foo(T emotion) {
    // do something else
}   

在重载返回可能实现不同接口的泛型类型的方法时也是如此,例如,如果在同一个类定义中存在以下两个方法:

public <T extends Happy> T foo(T emotion) {
    // do something
}   

public <T extends Sad> T foo(T emotion) {
    // do something else
}   

这是非法的吗?

5 个答案:

答案 0 :(得分:5)

这是合法的,因为输入参数也因类型而异。

因此,以下是合法的,

public <T extends Happy> T foo(T emotion) {
    // do something
}   

public <T extends Sad> T foo(T emotion) {
    // do something else
}

但以下不是,

public <T extends Happy> String foo(T emotion) {
    // do something
}   

public <T extends Happy> T foo(T emotion) {
    // do something else
} 

...谢谢

答案 1 :(得分:2)

这很好。

public class Main {
    public static void main(String[] args){
        Main main = new Main();
        main.foo("hello");
        main.foo(new Integer(5));
    }

    public <T extends String> T foo(T emotion) {
        return (T) "test";
    }

    public <T extends Integer> T foo(T emotion) {
        Integer integer = 5;
        return (T) integer;
    } 
}

答案 2 :(得分:2)

它会编译,但是你遇到问题的地方就是Happy或Sad是另一个的超类。

例如,以下编译:

public <T extends Number> T sayHi() {
    System.out.println("number");
    return null;
}

public <T extends Integer> T sayHi() {
    System.out.println("integer");
    return null;
}

但是,当您尝试编译以下内容时会遇到问题:

Integer test = sayHi();

在这种情况下,您根本无法将<Integer>添加到前面,因为Integer仍然是数字和整数。

但是以下编译

Double test2 = <Double>sayHi();

所以基本上只要一个Sad对象不能是Happy对象的实例,反之亦然,只要你在方法名称前面或前面调用它,你的代码就应该工作。

答案 3 :(得分:1)

您可以使用泛型来区分Java中的方法。 JVM没有看到这种类型,但是如果参数或返回类型不同,它仍将在Sun / Oracle编译器中编译。这不会为IBM / eclipse编译器编译。

这表明您希望在字节代码级别进行。 http://vanillajava.blogspot.com/2011/02/with-generics-return-type-is-part-of.html

答案 4 :(得分:1)

这是合法的,正如其他人所说的那样。但是,我想指出当类型相互扩展时会发生什么。

假设我们有两个接口(适用于类,只需更改签名):

interface Emotion {}
interface Happy extends Emotion {}

还有两个功能:

<T extends Emotion> void foo(T obj) {} // Referred as foo1
<T extends Happy> void foo(T obj) {} // Referred as foo2

如果一个对象符合Emotion,JVM将选择foo1。 如果一个对象符合Happy,则JVM将选择foo2而不是foo1。 注意优先顺序。这就是JVM解决模糊性的方法。但是,这仅在将generic参数作为参数传递时有效。