debugging 如何从数组中的不同对象调用相同的函数?[duplicate]

ejk8hzay  于 2023-01-26  发布在  其他
关注(0)|答案(3)|浏览(156)
    • 此问题在此处已有答案**:

How to call same method from two different classes in java(3个答案)
昨天关门了。
我有3个类-employeepartTime(扩展雇员)和bill。所有类都有一个名为issueCheque()的函数。
我有一个对象数组,我想调用每个对象的issueCheque()函数,这就是我正在做的。

Object[] arr = {employee obj,partTime obj, bill obj};

for(Object obj:arr) {
    obj.issueCheque();
}

但是这不起作用。我理解错误信息,但是我不知道怎么才能解决这个问题。

    • 错误**
Exception in thread "main" java.lang.Error: Unresolved compilation problem: 
    The method issueCheque() is undefined for the type Object

    at main.main(main.java:16)
ujv3wf0j

ujv3wf0j1#

你现在所做的将需要很多instanceof检查,你的例子中是2个,在真实的情况中可能更多。
最好引入一个由类实现的接口。

public interface ChequeIssuer {

  void issueCheque();
}

让所有可以发行支票的类都实现这个接口,现在就可以使用ChequeIssuer的集合,而不是Object

ChequeIssuer[] arr = {employee obj,partTime obj, bill obj};

for(ChequeIssuer obj: arr) {
    obj.issueCheque();
}

不需要类型检查或强制转换。
另外,请看一下What does it mean to "program to an interface"?,这是一个很好的阅读主题。

lnxxn5zx

lnxxn5zx2#

在这里,您需要通过选中instanceOf来强制转换Object

Object[] arr = {employee obj,partTime obj, bill obj};

for(Object obj:arr) {

    if(obj instanceOf employee) { // will cover employee and partTime as partTime extends employee
        ((employee) obj).issueCheque();
    } else if(obj instanceOf bill) {
        ((bill) obj).issueCheque();
    }  
}

注意:您的代码与Java编码标准完全不同步。请对此进行深入了解。

avwztpqn

avwztpqn3#

Object[]可以包含任何Object。即使在您的情况下,您只有实现issueCheque()方法的类的示例,但编译器无法保证这一点,因此它会拒绝。
你可以定义一个定义方法的接口,并让你的每个类型实现这个接口。然后你可以创建一个接口类型的数组/列表,它接受实现它的任何类型。

public interface ChequeIssuer {
  public void issueCheque();
}

举个例子...

public class Employee implements ChequeIssuer {
  ...
  @Override
  public void issueCheque() {
    dosomething();
  }
}

假设我们有其他类型PartTimeBill也实现了这些方法,我们可以使用接口作为公共类型将它们组合到集合/数组中。

ChequeIssuer[] chequeIssuers = {someEmployee, somePartTime, someBill};

相关问题