将非预定对象作为参数

时间:2018-04-19 21:55:29

标签: java

我正在尝试使用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方法?

2 个答案:

答案 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());
}

此外,您还可以使用反射来查找方法。但是,这不是很干净,而且往往会使用更多的资源。