2012-11-01 17 views
5

AdminRoleのリストを格納するために、クラスAuthenticatedUserを変更しようとしています。 AuthenticatedUserは私のすべてのアプリケーションで使用されるクラスです。ユーザーが正常にログインするとセッションに入ります。ここで、ユーザー・セッションに許可の役割のリストを追加します。しかし、各アプリケーションでは、AdminRoleクラスを少し違った方法で定義しています。たとえば、データベース内の私のDataCenterアプリケーションストア:Java抽象クラスとジェネリックス

employee_id 
    role_name 
    site_name 
    receive_email 

はなく、私のすべてのアプリケーションは、receive_emailフィールドが必要になりますか、独自のメソッドを拡張することもできます。私はこれが抽象クラスに呼ばれたと考えました。しかしEclipseはこのスニペットのAuthorized_role_list設定者の間違ったタイプについて不平を言っています。

DataCenterAdminRoleDAO dcAdminDao = new DataCenterAdminRoleDAO(); 
    try { 
     List<DataCenterAdminRole> authorized_roles = dcAdminDao.getAuthorizedRoleListByBadge(authenticatedUser.getBadge()); 
     authenticatedUser.setAuthorized_role_list(authorized_roles); 

=== Classes 

public class AuthenticatedUser extends Employee implements Serializable { 
    private static final long serialVersionUID = 1L; 
    private List<AdminRole> authorized_role_list; 
    ... 
} 

public abstract class AdminRole implements Serializable { 
    private static final long serialVersionUID = 1L; 
    private String role_name; //regular, admin, editor, etc.. 
    private String site_id; //company branches 
    ... 
} 

public class DataCenterAdminRole extends AdminRole implements Serializable { 

明らか修正は私のデータセンターの実装にAdminRoleのリストを返すことですが、私はサブクラスを渡すことができる抽象クラスを拡張して考えました。私は何が欠けていますか?

+0

[sscce](ショート、自己完結型、正しい例)を作成してください。私はコンパイルエラーがあることを知っていますが、その行にコメントを残すことができます。また、リファレンスせずにEclipseによって報告された実際のエラーを貼り付けます。 –

答えて

2

であるためにあなたのセッター/フィールドを変更するためにsetterメソッドをオーバーライドすることができますもしあなたがList<Orange>authorized_roles_list

private List<? extends AdminRole> authorized_role_list; 
.... 
public setAuthorized_role_list(List<? extends AdminRole> authorized_roles) { 
... 
} 
2

ジェネリックスは他のJavaと同じように動作しません。自動キャストアップが発生しないので、メソッドがList<List>を呼び出す場合は、List<ArrayList>を渡すことはできません。同様に、あなたのセッターがListを呼び出した場合、List<? extends AdminRole>と定義しない限り、List<? extends AdminRole>を渡すことはできません。あなたは、しかし、あなたがしたい場合List<DataCenterAdminRole>を取るか、あなたのList<DataCenterAdminRole>List<AdminRole>に変換、またはちょうどそれが与えているセッターならキャプチャタイプ<? extends AdminRole>

1

のワイルドカードと下限を使用することができ、トラブルはオレンジフルーツ場合でも、List<Fruit>ではありません。

List<Orange> orangeList = new ArrayList<Orange>(); 
List<Fruit> fruitList = orangeList; 
fruitList.add(new Apple()); 

とオレンジのリストは、リンゴが含まれているであろうから、それは、このように完全に、ジェネリックコレクションの型安全性を破る:それはList<Fruit>だった場合は、次の操作を行うことができます。あなたがやっていることを行うには、AuthenticatedUserにList<? extends AdminRole>が含まれている必要があります。

+0

あなたの類推をよりよく理解するために、Eclipseでこれをコード化しました。 2行目にエラーが表示されます。 Eclipseは果物のリストをに変更することを提案しています。私はこれがあなたが指摘していることだと思います。Eclipseがタイプセーフティを壊すのを妨げているのです。 – jeff

+0

はい、あなたはそれを持っています。 –