Java泛型中'&'和','有什么区别?

问题

在阅读有关泛型的Java官方教程时,我发现你可以限制类型参数(在本例中为isT)以使用'and'运算符(&)扩展类和/或更多接口,如下所示:

<T extends MyClass & Serializable>

我更换了&with,(错误地仍然有效,并发出轻微警告)。

我的问题是,这两者之间有什么区别:

<T extends MyClass & Serializable>
<T extends MyClass , Serializable> // here is with comma

并且示例方法:

static <T extends MyClass & Serializable> ArrayList<T> fromArrayToCollection(T[] a) {
    ArrayList<T> arr = new ArrayList<T>();

    for (T o : a) {
        arr.add(o); // Correct
    }
    return arr;
}

#1 热门回答(167 赞)

<T extends MyClass & Serializable>

这断言单一类型参数T必须延伸MyClass并且必须是Serializable

<T extends MyClass , Serializable>

这个声明的参数,一个名为T(必须扩展为MyClass),一个名为Serializable(隐藏java.io.Serializable-这可能是警告的内容)。