2016-11-23 36 views
0

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

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

该计划旨在让两个单独的类员工

public class Salaried implements Company 

public class Hourly implements Company 

和创作允许使用某些方法。这两个类都实现了接口,但也有其他独特的方法。

在测试类中,我试图使用arrayList来存储创建的不同雇员,以便他们的方法可以在以后使用。但是,由于我在创建员工时使用不在界面中的方法,因此程序无法编译,因此我不会使用这些方法。

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

+0

你可以使用'default'方法如果java 8 – Jerry06

+0

如果你不知道你指的是哪一类,那么你如何使用方法? – shmosel

+0

@shmosel我知道我指的是哪一类。我问的问题是如何将两个实现通用接口的类放入单个arrayList中,如果它们都需要从列表中访问以便使用未包含在接口中的方法。 –

回答

0

However the program won't compile as I use methods that aren't in the interface when creating the employees and it won't let me use those methods.

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

+0

这是导致错误的部分:'employees.add(new Salaried()); System.out.println(“请输入员工姓名:”); String _name = in.nextLine(); employees.get(0).setName(_name); System.out.println(“请输入社会安全号码:”); String _ssn = in.nextLine(); employees.get(0).setSsn(_ssn); System.out.println(“请输入年薪:”); double _annualSalary = in。nextDouble(); employees.get(0).setPay(_annualSalary); 的System.out.println(“工薪阶层已经建立。”);' - 它集名称并设置SSN罚款,但如果你想继续使用Company'的''一个不ArrayList'设置工资 –

+0

,然后实例一个'Salaried'雇员第一,设置其属性,然后添加到'ArrayList'。 – Tigin

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."); 
     } 
    } 
+1

这会工作,但它是一个讨厌的代码的气味,通常有处理这一问题的更清洁的方式。 – chrylis

+0

@chrylis同意。我总是喜欢使用超级类型。但是这个答案专门帮助OP。 –