6
4

4 に答える 4

7

戻ることができnew HashSet<Field>(EnumSet.allOf(Fields.class));ます。

Set<User.Fields>これにより、 type の値を typeの変数に代入できないという事実を回避できますSet<Field>

または、代わりにインターフェイスを使用することもできますSet<? extends Field> getFields()。キャプチャ変数に割り当てることができます。Set<User.Field>

于 2011-06-30T00:00:19.830 に答える
4

Collections.unmodifiableSetを使用します。

return Collections.<Field>unmodifiableSet(EnumSet.allOf(Fields.class));

長所:

  • 安全でない変換キャストはありません: 操作は実行時にタイプセーフです
  • 返されるセットは実際にはSet<Field>ではなくですSet<? extends Field>
  • セットはコピーされず、ラップされるだけです
  • 返されたセットは変更できません

短所:

  • 返されたセットを変更することはできませんが、とにかくそうするのは安全ではありません。
于 2011-06-30T00:02:04.607 に答える
1

これが機能しない理由はSet<Fields>、 のサブタイプではないためですSet<Field>。たとえば、Set<Fields>メソッドから a を返した場合、次のような状況になる可能性があります。

Set<Field> fieldSet = user.getFieldSet(); //Returns an EnumSet<Fields>
fieldSet.add(new Field(){}); //Would compile, but would blow up at runtime, 
                             //because the set can only contain Fields enum 
                             //constants

ここでの最良のオプションは、別のセットの実装 (通常は変更不可能なセット) を使用して値を返すことです。例えば:

Set<Field> getFieldSet() {
    return Collections.unmodifiableSet(EnumSet.allOf(Fields.class));
}

または、セットを変更可能にする必要がある場合(通常は、おそらく良い考えではありません)

Set<Field> getFieldSet() {
    return new HashSet(EnumSet.allOf(Fields.class));
}
于 2011-06-30T00:10:54.440 に答える
0

これが良い解決策だと思います。それはまさにあなたが望むものではありませんが、十分に近いものです

import java.util.EnumSet;
import java.util.Set;

public class User {
    enum Fields implements Field {
        USERNAME,
        PASSWORD;
    }

    Set< ? extends Field> getFieldSet() {
        return EnumSet.allOf(Fields.class);
    }
}
于 2011-06-30T00:00:40.930 に答える