Java泛型中"&"和","的区别是什么?

110

在阅读Java官方教程中关于泛型的部分时,我发现可以使用“&”运算符将类型参数(在本例中为T)限制为扩展自一个类和/或多个接口,如下所示:

<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,你假设原帖作者使用的是和你一样的键盘。” - emory
3
我认为即使是这样的方向也是错误的 - 错误不在他的手指上,而在他的大脑中。就好像在Java源文件中使用'include'而不是'import'一样。你打错了'include',因为你的大脑告诉你要输入错误的内容,可能有多种原因。 - Nick Pickering
2
@Nicholas Pickering是正确的!对我来说,这不是因为键盘而是因为大脑出错。当你写一个类实现哪些接口时,你需要用逗号将它们分开。 - Alin Ciocan
1个回答

170
<T extends MyClass & Serializable>

这表明单个类型参数 T 必须扩展 MyClass 并且必须是 Serializable
<T extends MyClass , Serializable>

This声明了两个类型参数,一个叫做T(它必须扩展MyClass),另一个叫做Serializable(它隐藏了java.io.Serializable - 这可能是警告的原因)。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接