2017-06-12 148 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