【问题标题】:Using an Interface in an ArrayList在 ArrayList 中使用接口
【发布时间】:2016-11-23 11:06:21
【问题描述】:

好的,所以我有一个接口和 2 个实现它的类。唯一的问题是这两个类中都有未在接口中列出的方法。我有一个使用接口类型的 ArrayList 的测试类:

ArrayList<Company> employees = new ArrayList<Company>();

该计划旨在允许创建两个不同类别的员工

public class Salaried implements Company 

public class Hourly implements Company

并允许与它们一起使用某些方法。这两个类都实现了接口,但也有自己独有的附加方法。

在测试类中,我尝试使用arrayList来存储创建的不同员工,以便以后可以使用他们的方法。但是程序不会编译,因为我在创建员工时使用了不在界面中的方法,并且它不会让我使用这些方法。

我应该如何解决这个问题?是接口内的错误还是类本身内的错误?

【问题讨论】:

  • 如果是java 8,你可以使用default方法
  • 如果你不知道你指的是哪个类,你希望如何使用一个方法?
  • @shmosel 我知道我指的是哪个类。我的问题是,如果两个实现公共接口的类都需要从列表中访问以使用接口中未包含的方法,如何将它们放入单个 arrayList 中。
  • 如果您知道它是哪个类,请使用该类的列表而不是接口。
  • 这表明您的设计存在问题。一般来说,您应该在具有通用界面的级别上进行操作。提供一些具体示例可能有助于我们提出替代方案。

标签: java arraylist interface


【解决方案1】:

如果我理解正确,你应该投。尝试类型类型转换以调用特定于实现的方法。

ArrayList<Company> companies = new ArrayList<>();

    for (Company c : companies) {
        if (c instanceof Salaried) {
            Salaried s = (Salaried) c;
            //call salaried methods
        } else if (c instanceof Hourly) {
            Hourly h = (Hourly) c;
            //call hourly methods
        } else {
            throw new AssertionError("Unknown subtype of Company found.");
        }
    }

【讨论】:

  • 这行得通,但它是一种令人讨厌的代码味道,通常有一种更简洁的方法来处理这个问题。
  • @chrylis 同意。我总是更喜欢使用超级类型。但这个答案是专门为帮助 OP 的。
【解决方案2】:

但是程序无法编译,因为我在创建员工时使用了接口中没有的方法,并且它不允许我使用这些方法。

我不确定你的意思。如果实例化Salaried 类型的变量,则可以调用特定于Salaried 类的方法。 Hourly 也是如此。从那里,您可以添加到您的ArrayList,因为SalariedHourly 都实现了Company

【讨论】:

  • 这是导致错误的部分:employees.add(new Salaried()); System.out.println("Please enter employee name: "); String _name = in.nextLine(); employees.get(0).setName(_name); System.out.println("Please enter the social security number: "); String _ssn = in.nextLine(); employees.get(0).setSsn(_ssn); System.out.println("Please enter the annual pay: "); double _annualSalary = in.nextDouble(); employees.get(0).setPay(_annualSalary); System.out.println("Salaried Employee has been created."); - 它确实设置了名称和设置 ssn,但没有设置支付
  • 如果您想继续使用CompanyArrayList,则先实例化Salaried 员工,设置其属性,然后添加到ArrayList
猜你喜欢
  • 2020-06-23
  • 1970-01-01
  • 1970-01-01
  • 2011-07-10
  • 2013-04-22
  • 1970-01-01
  • 1970-01-01
  • 2017-06-13
  • 2021-09-01
相关资源
最近更新 更多