2017-06-12 152 views
1

我有這個事件類,我想使其更通用,所以我可以返回其他類型,而不僅僅是用戶,是否有一種方法在這個事件類內自動鑄造,或者我應該每次都在外面做的呢?Java泛型自動鑄造

您有什麼建議嗎?

我有什麼

public class Event { 
    protected String name; 
    protected Pair<String, User> event; 

    public String getName() { 
    return event.first; 
    } 

    public User getData() { 
    return event.second; 
    } 

    public Event(String name, User data) { 
    event = Pair.create(name, data); 
    } 
} 

我想

public class Event<T> { 
    protected String name; 
    protected Pair<String, T> event; 

    public String getName() { 
    return event.first; 
    } 

    public T getData() { 
    return event.second; //cast to type 
    } 

    public Event(String name, T data) { 
    event = Pair.create(name, data); 
    } 
} 
+1

沒有必要投(但我們沒有對' (定義),因爲(看來)'second'是類型'T','getData()'是'T'。 –

+1

我沒有得到你想要的東西。如果我沒有遺漏任何東西,你發佈的第二個代碼應該可以工作。 –

+0

你爲什麼認爲你需要從「T」到「T」? – f1sh

回答

1

我不知道你是如何定義的Pair,但沒有任何鑄造以下工作要求:

public class Pair<F,S> 
{ 
    F first; 
    S second; 
    public Pair (F first, S second) { 
    this.first=first; 
    this.second=second; 
    } 
    public static <F,S> Pair<F,S> create (F first, S second) { 
    return new Pair<F,S> (first,second); 
    } 
} 

public class Event<T> { 
    protected String name; 
    protected Pair<String, T> event; 

    public String getName() { 
    return event.first; 
    } 

    public T getData() { 
    return event.second; 
    } 

    public Event(String name, T data) { 
    event = Pair.create (name, data); // note you can use the Pair constructor directly 
             // instead of calling the static create method 
    } 
} 

哪些可以使用,例如,像這樣:

Event<Integer> intEvent = new Event<> ("name", 5); 
Integer data = intEvent.getData(); 
1

什麼,當你創建的一個實例,T就會自動「取代」以User 所以public T getData()實際返回的用戶和​​有不需要鑄造

+0

這就是我想要的,但是現在'getData()'返回'Object'。我是否缺少什麼? –

+0

這就是我創建類 'new Event <>(eventName,user)' –

+0

@LeonardoDeleon問題在於您創建類的實例的方式。一個正確的實例化類將是Event event = new Event <>(eventName,user) – Raffolox