Java无限递归的自引用类型

时间:2015-06-15 02:13:31

标签: java generics recursion types

我试图创建一个以集合为键的Map实现。

你甚至把这个难题称为什么?

进行班级签名的正确方法是什么?

@Override
protected void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    setContentView(R.layout.activity_main);
    RelativeLayout layout=(RelativeLayout) findViewById(R.id.rlt);
    TextView txtv=new TextView(this);//I want to set an Id for this element
    txtv.setText("My Text");
    layout.addView(txtv);
}

^^语法不正确,但表明我想做什么。

class SubClass <K extends Collection<E>, V> implements Map<K, V>

^^结果在SubClass中,您永远不能声明泛型类型。 K是无限递归的。它也没有描述我正在寻找的行为类型。

class SubClass <K extends Collection<K>, V> implements Map<Collection<K>, V>

^^不强制执行K需要成为集合的约束

class SubClass <K , V> implements Map<K, V>

^^不允许我们知道集合的通用类型

class SubClass <K extends Collection, V> implements Map<K, V>

^^工作,但相当笨重

1 个答案:

答案 0 :(得分:7)

您需要Collection元素类型的类型参数,如果需要,可能需要实际Collection类型的类型参数,以及值的类型参数。

class SubClass<E, K extends Collection<E>, V> implements Map<K, V> { ... }

如果您不需要特定的Collection类型,则可以使用

class SubClass<E, V> implements Map<Collection<E>, V> { ... }

关于对您问题的各种评论

public class Example {
    public static void main(String[] args) throws Exception {
        Whatever<Self> s = new Whatever<>();
    }
}

class Self extends ArrayList<Self> {
}

class Whatever<E extends Collection<E>> {
}