必要なのは、特定の型のオブジェクトを保持するために型指定できるクラスを定義することです。保持されたオブジェクトには、それを含むクラスへの参照も必要です。
間違ったツリーを吠えているのか、それとも型の安全性に関する Eclipse の警告以外の解決策に近づいているのかはわかりません。
インターフェイスは次のようになります (これは正しく定義されているようです)。
public interface ItemInterface {
public ItemOwner<? extends ItemInterface> getOwner();
public void setOwner(ItemOwner<? extends ItemInterface> owner);
}
所有者クラスは次のようになります (これも単純なようです)。
public class ItemOwner <T extends ItemInterface> {
private NavigableSet<T> items = new TreeSet<T>();
public Set<T> getItems() {
return Collections.unmodifiableSet(items);
}
public void addItem(T item) {
// if we are passed a null, throw an ILA error
if (item == null)
throw new IllegalArgumentException("Argument was null.");
// check whether already is a member
if (items.contains(item))
throw new IllegalArgumentException("Already a member.");
items.add(item);
item.setOwner(this);
}
public void removeNode(T item) {
// if we are passed a null, throw an ILA error
if (item == null)
throw new IllegalArgumentException("Argument was null.");
// check whether node already is a member
if (!items.contains(item))
throw new IllegalArgumentException("Not a member.");
items.remove(item);
}
}
所有できるアイテムは次のようになります。
public class Item implements ItemInterface {
private ItemOwner<? extends ItemInterface> owner;
public ItemOwner<? extends ItemInterface> getOwner() {
return owner;
}
public void setOwner(ItemOwner<? extends ItemInterface> owner) {
// if we are passed a null, throw an ILA error
if (owner== null)
throw new IllegalArgumentException("Argument was null.");
this.owner = owner;
}
}
私が Eclipse で得ているエラーは、getOwner() に関する警告です。