5

AuthenticatedUserのリストを格納するようにクラスを変更しようとしていAdminRoleます。 AuthenticatedUser私のすべてのアプリケーションで使用されるクラスです。ユーザーが正常にログインすると、セッションに入れられます。次に、承認ロールのリストをユーザーセッションに追加します。ただし、各アプリケーションはAdminRoleクラスを少し異なる方法で定義します。たとえば、私のDataCenterアプリケーションはデータベースに保存します。

  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、抽象クラスを拡張することで、サブクラスを渡すことができると思いました。私は何が欠けていますか?

4

3 に答える 3

2

ジェネリックは他のJavaのようには動作しません。自動キャストアップは発生しないため、メソッドがを要求する場合、List<List>それを渡すことはできませんList<ArrayList>List<? extends AdminRole>同様に、ここで、セッターがリストを要求した場合、それをとして定義しない限り、リストを渡すことはできませんList<? extends AdminRole>。ただし、必要に応じてsetterメソッドをオーバーライドして、を取得するList<DataCenterAdminRole>か、をに変換するかList<DataCenterAdminRole>List<AdminRole>setter/フィールドをキャプチャタイプに変更することができます。<? extends AdminRole>

于 2012-11-01T23:03:44.297 に答える
2

問題を引き起こしているのがセッターの場合は、ワイルドカードを使用して下限を使用できます。authorized_roles_list

private List<? extends AdminRole> authorized_role_list;
....
public setAuthorized_role_list(List<? extends AdminRole> authorized_roles) {
...
}
于 2012-11-01T23:04:04.650 に答える
1

オレンジが果物であっても、AList<Orange>はではありません。List<Fruit>だった場合List<Fruit>は、次のようにすることができます。

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

したがって、オレンジのリストにはリンゴが含まれるため、ジェネリックコレクションの型安全性が完全に失われます。AuthenticatedUserには、List<? extends AdminRole>実行していることを実行できるようにするためのが含まれている必要があります。

于 2012-11-01T23:06:36.087 に答える