2015-03-19 118 views
0

我會嘗試儘可能簡單地設置它,因爲它也讓我感到困惑。調用類型對象的方法類

我返回類型的對象的方法Class

public Class foo(){...} 

當我把這個方法我保持的結果類型,即類的變量

Class obj = new foo(); 

foo()可以返回許多不同的類,但它們都包含相同的方法bar()

如何從我的obj變量調用該方法?我試過obj.bar()但IDE似乎並不喜歡它。我得到

Error:(59, 34) error: cannot find symbol method bar()

+2

'類的obj =新富()'永遠不會是有效的,除非你是在談論一個不同的'Class'型比'java.lang.Class' 。一個簡短但完整的程序展示了這個問題會使這一切變得更加清晰。 – 2015-03-19 09:45:25

+0

您必須使用'((foof)obj).bar()' – Jens 2015-03-19 09:46:07

+0

正如Jon Skeet所說,「Class obj = new foo()'是無效的。你可能想做一些像'Foo obj = foo()。newInstance()',然後'obj.bar()'。 – NiziL 2015-03-19 09:48:05

回答

0

如果所有返回的值是實現相同方法的類的對象,你應該聲明在單獨的接口,方法,讓他們實現它。稍後,您可以使用通用通配符如<? extends BarInterface>或將返回類型更改爲BarInterface

public interface BarInterface{ 
    public void bar(); 
} 

public <T extends BarInterface> foo(){...} 

public BarInterface foo() {...} 
2

好像要分組的行爲,這就是Java interfaces做:

interface Barer { 
    String bar(); 
} 

class Foo implements Barer { 
    String bar() { 
     return "I'm a Foo"; 
    } 
} 

class Fooz implements Barer { 
    String bar() { 
     return "I'm a Fooz"; 
    } 
} 

然後在你的代碼,你可以有像這樣的:

Barer obj; 

if (something) { 
    obj = new Foo(); 
} else { 
    obj = new Fooz(); 
} 

obj.bar() 

這使得實際上存儲在Class對象構造函數的返回值意義不大。


如果你真的是你需要一個Class對象(請記住,它只是指向類,而不是你所創建的實例)的情況下,你可以使用Java reflection

Class obj = new foo(); 
Method method = obj.getDeclaredMethod("bar"); 
method.invoke(null); 
+0

這可能是最好的方法。如果出於任何原因必須使用醜陋的黑客技術(但可能應該使其代碼不適合這樣做,並使用上面描述的接口來代替):方法m = obj.getDeclaredMethod(「bar」,null); Object o = m.invoke(null,null); – Nytux 2015-03-19 10:02:57

+0

是的,我剛剛添加了這種情況;) – 2015-03-19 10:03:26

+0

你比我快:)。另外,正如問題的註釋中所提到的那樣,'Class obj = new foo();'應該被'Class obj = foo();' – Nytux 2015-03-19 10:22:18

1

如果方法foo()返回Class,它意味着它不會返回您想要調用bar()方法的objet的實際實例,而是該類本身,因此無法在Class上調用方法bar()因爲Class.class沒有方法欄。

在你的代碼示例有一些錯誤

Class obj = new foo(); 

關鍵字意味着你正在創建一個類的新實例,而不是你調用一個對象的方法。


實際上正確的方法是使用接口。

代替從foo的方法返回類,聲明一個接口,

public interface MyInterface { 
    public void bar(); 
} 

和使FOO()返回MyInterface的,而不是類。

然後,你可以做

MyInterface obj = tmp.foo(); 
obj.bar() 
相關問題