[英]Can you do method overloading with generics and only change the generic type of the method signature?
如果你不使用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
}
這是非法的嗎?
這是合法的,因為輸入參數也因類型而異。
因此,以下是合法的,
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
}
謝謝...
這樣運行得很好。
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;
}
}
它會編譯,但是如果遇到問題就是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仍然是Number和Integer。
但是以下編譯
Double test2 = <Double>sayHi();
所以基本上只要一個Sad對象不能成為Happy對象的實例,反之亦然,只要用方法名稱或前面的方法調用它,你的代碼就應該工作。
正如其他人所說,這是合法的。 但是,我想指出當類型相互擴展時會發生什么。
假設我們有兩個接口(適用於類,只需更改簽名):
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參數作為參數傳遞時有效。
您可以使用泛型來區分Java中的方法。 JVM沒有看到這種類型,但是如果參數或返回類型不同,它仍將在Sun / Oracle編譯器中編譯。 這不會為IBM / eclipse編譯器編譯。
這表明您希望在字節代碼級別發生。 http://vanillajava.blogspot.com/2011/02/with-generics-return-type-is-part-of.html
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.