2016-11-23 4 views
0

私はInterfaceと2つのクラスを実装しています。唯一の問題は、どちらのクラスも、インターフェイス内にリストされていないメソッドを持っていることです。プログラムは、従業員ArrayListでのインターフェイスの使用

public class Salaried implements Company 

public class Hourly implements Company 

との2つの別々のクラスを作成できるように設計されて

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

:私は、インターフェイスタイプのArrayListのを使用してテストクラスを持っています特定のメソッドをそれらと共に使用できるようにします。 2つのクラスはどちらもインタフェースを実装しますが、独自のメソッドも追加しています。

テストクラスでは、作成した別の従業員を格納するためにarrayListを使用して、そのメソッドを後で使用できるようにしようとしています。しかし、私は従業員を作成するときにインターフェイスにないメソッドを使用するので、プログラムはコンパイルされませんし、私はそれらのメソッドを使用させません。

これを修正するにはどうすればよいですか?インターフェース内やクラス内のミスですか?

+0

あなたは、あなたが参照しているどのクラスがわからない場合、Java 8 – Jerry06

+0

がどのようにメソッドを使用することを期待していない場合は、defaultをメソッドを使用できますか? – shmosel

+0

@shmosel私はどのクラスを指しているのか知っています。私の質問は、インターフェイスに含まれていないメソッドを使用するために、リストからアクセスする必要がある場合は、共通のインターフェイスを実装する2つのクラスを単一の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についても同様です。そこから、SalariedHourlyの両方がCompanyを実装しているため、ArrayListに追加できます。

+0

これはエラーを引き起こす部分です: 'employees.add(new Salaried()); System.out.println( "従業員の名前を入力してください:"); 文字列_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 =。nextDouble(); employees.get(0).setPay(_annualSalary); System.out.println( "Salary Employee"が作成されました); ' - 名前を設定し、ssnをうまく設定しましたが、支払いを設定しません –

+0

' Company'の 'ArrayList'を使い続けたい場合は、 '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を助けることです。 –

関連する問題