2015-03-19 117 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() 
相关问题