我会尝试尽可能简单地设置它,因为它也让我感到困惑。
我有一个方法返回Class
类型的对象,即
public Class foo(){...}
当我称这种方法时,我将结果保存在Class类型的变量中,即
Class obj = new foo();
foo()
可以返回许多不同的类,但它们都包含相同的方法bar()
。
如何从obj
变量调用该方法?
我尝试了obj.bar()
,但IDE似乎并不喜欢它。我得到了
错误:(59,34)错误:找不到符号方法
bar()
答案 0 :(得分: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对象(请记住它只指向Class,而不是指向你创建的实例),你可以使用Java reflection:
Class obj = new foo();
Method method = obj.getDeclaredMethod("bar");
method.invoke(null);
答案 1 :(得分:1)
如果方法foo()返回Class,则意味着它不会返回你想要调用bar()方法的objet的实际实例,而是类本身,所以它不可能在Class.class上调用方法bar()没有方法栏。
在您的代码示例中存在一些错误
Class obj = new foo();
关键字 new 意味着您正在创建一个新的类实例,而不是您在对象上调用方法。
事实上,正确的方法是使用接口。
而不是从foo方法返回Class,声明一个接口,
public interface MyInterface {
public void bar();
}
并使foo()返回MyInterface而不是Class。
然后你可以做
MyInterface obj = tmp.foo();
obj.bar()
答案 2 :(得分:0)
如果所有返回的值都是实现相同方法的类的对象,则应该在单独的接口中声明该方法并让它们实现它。稍后您可以使用通用通配符,例如<? extends BarInterface>
或将返回类型更改为BarInterface
。
public interface BarInterface{
public void bar();
}
和
public <T extends BarInterface> foo(){...}
或
public BarInterface foo() {...}