java - A が B から継承する場合のEnumSetから Set への変換
3265 次
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 に答える