2016-11-23 76 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。 –