我正在尝试使用java,我遇到了传递对象的问题。 因为我主要面向脚本语言,所以类型等都没有问题。
在JAVA中,我有一些定义RESTful Client的对象,每个对象都是为一个表定义的,但是它们都有一些相同的方法。
我的问题是: 在java中是否可以有一个方法,即调用传递对象的方法?
这是一段代码:
ClientA ca;
ClientA cb;
public void main(String[] args){
ca = new ClientA();
cb = new ClientB();
callCount(ca);
}
public void callCount(Object o){
System.out.println("count of "+o.getName()+" is:"+o.countREST());
}
这在脚本语言中几乎是可能的,但在这里,IDE大声说,他不知道Object o的方法。
现在,我知道,这是类型转换的问题,因为代码必须在调用其方法之前知道对象的类型。
也许通用VAR会起作用,但我没有Java 10(2018年3月),并且由于我必须使用Java 9。
所以问题很明显:这里有什么好方法(并且很好我的意思是一些oneliner或一些泛型转换,如果不是丑陋,切换或者像那样),如何将非预定对象传递给方法并强制程序运行方法?当然,可以使用try / catch块确保传递的对象实际上有这个方法,但这是我的责任。
或者这是不可能的,我必须对每种类型的对象进行copypaste方法?
答案 0 :(得分:0)
您应该尝试使用界面。创建一个界面,使您所有的对象都具有所需的方法。然后,无论对象如何,只要它implements DesiredInterface
这样的事情:
interface IFoo() { /*Methods*/ }
然后
class Foo implements IFoo() { /*Yata yata*/ }
答案 1 :(得分:0)
有几种方法可以做到这一点。
您可以执行以下操作:
public void callCount(Object o){
if(o instanceof Client A){
System.out.println("count of "+ ((ClientA) o.getName()+" is:"+ (ClientA) o.countREST());
}
}
使用抽象类
如果您对要传入的类有一些了解,并且它们共享一些相同的功能,您可以这样做:
public class BaseClass{
public void getName(){
//do something
}
public void countREST(){
//do something
}
}
public class ClientA extends BaseClass{
}
public class ClientB extends BaseClass{
}
public void main(String[] args){
ca = new ClientA();
cb = new ClientB();
callCount(ca);
}
public void callCount(BaseClass o){
System.out.println("count of "+o.getName()+" is:"+o.countREST());
}
用户界面
如果他们没有共享功能,并且您希望每个类都能处理他们自己的实现,那么您可以这样做:
public interface BaseClass{
public void getName();
public void countREST();
}
public class ClientA implements BaseClass{
@Override
public void getName(){
//Do ClientA GetName
}
@Override
public void countREST(){
//Do ClientA countREST
}
}
public class ClientB implements BaseClass{
@Override
public void getName(){
//Do ClientB GetName
}
@Override
public void countREST(){
//Do ClientB countREST
}
}
public void main(String[] args){
ca = new ClientA();
cb = new ClientB();
callCount(ca);
}
public void callCount(BaseClass o){
System.out.println("count of "+o.getName()+" is:"+o.countREST());
}
此外,您还可以使用反射来查找方法。但是,这不是很干净,而且往往会使用更多的资源。