如果你不使用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
}
这是非法的吗?
答案 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参数作为参数传递时有效。