Java泛型中的“&”和“,”有什么区别?


110

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

<T extends MyClass & Serializable>

我取代了&,(错误和仍然有效,与未成年人的警告)。

我的问题是,两者之间是否有任何区别:

<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;
}

5
@Doorknob,您假设OP使用的是键盘,并且使用的是相同的键盘。
2013年

3
@emory我认为方向还是错误的-错误不是在他的手指上,而是在他的大脑上。就像您试图在Java源文件中使用'include'而不是'import'一样。您输错了“ include”,因为您的大脑告诉您输错了内容,这可能由于多种原因。
Nick Pickering

2
@尼古拉斯·皮克林(Nicholas Pickering),对!对我来说,这不是因为键盘而引起的打字错误,而是因为大脑。编写类实现的接口时,请用逗号分隔它们。
Alin Ciocan

Answers:


169
<T extends MyClass & Serializable>

这断言单一类型参数T必须扩展MyClass且必须为Serializable

<T extends MyClass , Serializable>

声明了两个类型参数,一个称为T(必须扩展MyClass),另一个称为Serializable(隐藏的java.io.Serializable—这可能是警告所针对的)。

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.