2017-08-09 48 views
2

正在對一些簡單的使用具有兩個構造衝突的構造器在運行時泛型類

public class GenericObject<M> { 

    private String string; 
    private M generic; 

    public GenericObject(String string) { 
     this.string = string; 
    } 

    public GenericObject(M generic) { 
     this.generic= generic; 
     this.string = "default"; 
    } 

} 

然後在一個點上,我需要一個GenericObject<String>

GenericObject<String> obj = new GenericObject<>("randomString"); 

泛型類和後來我發現在調試時使用String構造函數而不是預期的通用函數。

但是我可以改變我想這個類,所以它不是解決問題,但我想知道如果有一種方法來暗示在運行時在這種情況下要使用的構造

+6

使用'String'構造函數是因爲它比用於泛型調用的'Object'構造函數更精確。我會說你在這種情況下設計了這個班。 – Kayaman

+4

我至少在幾次之前見過這個問題。我認爲JLS在不確定要調用哪種方法的情況下會提到更具體的版本。在這種情況下,'String'比泛型更具體,所以前者被調用。 –

+0

我看到... thx的快速回答!馬上改變設計 – Zeromus

回答

3

讓我們看看字節碼:enter image description here

由於類型擦除的第二構造函數變得public GenericObject(Object generic)並作爲用戶Kayaman和Tim Biegeleisen表示,String更具體然後Object,因此第一構造函數被調用。

+1

只是爲了完成 - 這裏從oracle的一些例子:https://docs.oracle.com/javase/tutorial/java/generics/genTypes.html – Silk0vsky