具有反比关系的通用接口

Tho*_*hor 6 java generics interface

我想创建两个具有反向关系的接口.

public interface Item <D extends Description,
                                        C extends Category<D,Item<D,C>>> {
    public C getCategory();
    public void setCategory(C category);}
Run Code Online (Sandbox Code Playgroud)

我不确定表达式C extends Category<D,Item<D,C>>是否正确,但至少没有编译器错误.

public interface Category<D extends Description, I extends Item> {
    public List<I> getItems();
    public void setItems(List<I> items);}
Run Code Online (Sandbox Code Playgroud)

I extends Item发出警告Item is a raw type. References to Item<D,C> should be parametrized.我试过了

I extends Item<D,Category<D,I>>
Run Code Online (Sandbox Code Playgroud)

但这会导致错误Bound mismatch: The type Category<D,I> is not a valid substitute for the bounded parameter <C extends Category<D,Item<D,C>>> of the type Item<D,C>.如何Category使用泛型正确地对接口进行参数化?

Mih*_*der 2

这似乎有效:)。我不知道如何解释它(我通常会尽量避免做类似的事情)但事情是这样的:

interface Description {}

interface Item<D extends Description, I extends Item<D, I, C>, C extends Category<D, C, I>>
{
    public C getCategory();   
    public void setCategory(C category);

}

interface Category<D extends Description, C extends Category<D, C, I>, I extends Item<D, I, C>> {    
    public List<I> getItems();   
    public void setItems(List<I> items);
}

class DescriptionImpl implements Description {}

class CustomItem implements Item<DescriptionImpl, CustomItem, CustomCategory> {
    public CustomCategory getCategory() {
        return null;  
    }

    public void setCategory(CustomCategory category) {
    }
}

class CustomCategory implements Category<DescriptionImpl, CustomCategory, CustomItem> {

    public List<CustomItem> getItems() {
        return null;          }

    public void setItems(List<CustomItem> items) {
    }
}
Run Code Online (Sandbox Code Playgroud)

现在如果你这样做:

CustomCategory customCategory = new CustomCategory();
CustomItem customItem = new CustomItem();
DescriptionImpl description = new DescriptionImpl();

customItem.getCategory();
Run Code Online (Sandbox Code Playgroud)

返回的类别类型customItem.getCategory()是 CustomCategory,我认为这是您真正想要的。