簡體   English   中英

你能用泛型進行方法重載,只改變方法簽名的泛型類型嗎?

[英]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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM