2

ResourceItem オブジェクトを含む resourceItems という名前のリストがあります。

    public class ResourceItem {
        private Long id;
        private String name;
        public ResourceItem(Long id, String name) {
            this.id = id;
            this.name = name;
        }
        // getters and setters...
    }

    public class SomeClass {
        private List<ResourceItem>  resourceItems = FindAllResourcesWebSerbice();
    }

リスト内のオブジェクトを拡張して、selected という名前のブール フィールドを含めたいと思います。

ジェネリックを使用したオプションを含む、ResourceItem (以下を参照) を拡張するクラスのいくつかのバリエーションを試しましたが、成功しませんでした。再利用のためにジェネリックを使用するソリューションが大好きです。

    public class ExtendedResourceItem extends ResourceItem {
        private boolean selected = false;
        public ExtendedResourceItem() {
        }

        public boolean isSelected() {
            return selected;
        }

        public void setSelected(boolean selected) {
            this.selected = selected;
        }
    }

    public class SomeClass {
        private List<ResourceItem>  resourceItems = FindAllResourcesWebSerbice();
        private List<ExtendedResourceItem> extendedResourceItem = resourceItems;
    }

どんな助けでも大歓迎です。

4

4 に答える 4

1

ResourceItem正しく実装されているequalsと仮定するとhashCode、選択されたもののセットを保持しないのはなぜですか。

Set<ResourceItem> selectedResourceItems = new HashSet<ResourceItem>();

次にadd、アイテムが選択されているときはセットに、選択されていないときはアイテムをセットに追加し、選択されているかどうかを知る必要があるときにremoveセットされているかどうかを確認できます。contains

この解決策は、 の使用に関するMichael Myers のコメントに非常に似ていMap<ResourceItem, Boolean>ます。

于 2012-11-14T15:44:29.417 に答える
0

ここでは、継承ではなく合成を使用する必要があります。あなたの説明からはドメインオブジェクトのように聞こえますResourceItemが、画面上ではラップする必要があります

class ScreenResourceItem {
    ResourceItem item;
    boolean selected;
}

の新しいリストを作成しScreenResourceItem、ラップされたすべてのResourceItems をそのリストに入れます。

ここでは、ジェネリックとリストの共分散は関係ありません。

于 2012-11-14T15:49:44.800 に答える
0

しかし、あなたのスニペットを使用して:

private List<ResourceItem> resourceItems = ... \\ some assignment;
private List<ExtendedResourceItem> extendedResourceItems = resourceItems;

絶対に間違っています。ResourceItem が ExtendedResourceItem であることが保証されているわけではないためです。(resourceItems リストには、ResourceItem であるが ExtendedResourceItem ではないオブジェクトを含めることができます)。

あなたが到達したいポイントはわかりませんが、resourceItems をselected属性を持つ resourceItems のリストに変換したい場合、この概念はどうですか:

public class ExtendedResourceItem {
    private ResourceItem item = null;
    private boolean selected = false;

    public ExtendedResourceItem(ResourceItem item, boolean selected) {
        this.item = item;
        this.selected = selected;
    }

    // ... getters and setters
}

public class SomeClass {
    private List<ResourceItem> resourceItems = FindAllResourcesWebSerbice();

    private List<ExtendedResourceItem> extendedResourceItems = new ArrayList<ExtendedResourceItem>();
    for (ResourceItem item: resourceItems) {
        extendedResourceItems.add(new ExtendedResourceItem(item, false));
    }
}
于 2012-11-14T15:53:21.137 に答える
0

紛らわしいのはジェネリックの制限ですか?Upper Bounded Wildcardsを使用してみてください。

public class SomeClass {
    private List<ExtendedResourceItem> extendedResourceItems = FindAllResourcesWebSerbice();
    private List<? extends ResourceItem> resourceItems = extendedResourceItems;
}

または:

public class SomeClass {
    private List<? extends ExtendedResourceItem> extendedResourceItems = FindAllResourcesWebSerbice();
    private List<? extends ResourceItem> resourceItems = extendedResourceItems;
}

ワイルドカードに関する詳細情報 ワイルドカードとサブタイプ.

于 2012-11-14T16:18:56.877 に答える