2016-04-04 44 views
0

我所試圖實現的是類似以下內容:的Java的getter返回類型

public class Foo { 
    Object o; 

    public Foo(Object o) { //takes object 
     this.o = o; 
    } 

    public <T> T getO() { //the return type of this should be the object type 
     return (T) o; 
    } 
} 

例如:

Object o = "123"; // imagine this comes from external system and can be anything 
Foo foo = new Foo(o); 
String foo = foo.getO(); //returns String 

我看到了使用谷歌的幾個例子在做類似的事情番石榴TypeToken但無法得到完全我想要的行爲。

+0

沒有'Foo'是一個泛型類型,這是行不通的 - 編譯器如何知道如何調用'Foo.getO()'? –

+1

您需要製作Foo通用或使用反射...這裏有類似的東西嗎? http://stackoverflow.com/questions/75175/create-instance-of-generic-type-in​​-java – ACV

回答

4

你可以做你想做的,如果你讓美孚擁有正確的類型

public class Foo<T> { 
    T data; 

    public Foo(T d) 
    { 
     this.data = d; 
    } 

    public T getData() 
    { 
    return data; 
    } 
} 

然後你的例子會工作:

Foo<String> foo = new Foo<>("123"); //passing String 
String foo = foo.getData(); //return String 

Foo<Float> foo = new Foo<>(123f); //passing float 
float foo = foo.getData(); //return float 

編輯:原來的問題略有更新。但是,基本問題仍然是Java方法必須聲明其返回類型。如果可以通過擴展層次結構以某種方式使用covariant返回,則可以關閉。有例子Overriding a method with different return typesCan overridden methods differ in return type

人們也可以考慮工廠模式來協助這種方法。所以它會是

Foo foo = FooFactory.geetFoo(originalData); // the specific foo would vary 
String s = foo.getData(); 
+0

換句話說,如果你不知道對象類型是不可能的? –

+0

@StoyanDekov你是對的。如果在編譯時不知道對象類型,那麼在編譯時就不可能知道返回值的對象類型。 – Andreas

+0

請看編輯的例子。 –