键入具有多个边界的参数

Gma*_*car 8 java generics

此代码编译:

import java.io.Serializable;
import java.util.Arrays;
class Test<T extends Arrays & Serializable> { }
Run Code Online (Sandbox Code Playgroud)

但如果我用最后一行替换

class Test<T extends Serializable & Arrays> { }
Run Code Online (Sandbox Code Playgroud)

我得到"预期界面".为什么?

Jon*_*eet 13

JLS第4.4节开始:

声明为类型参数的每个类型变量都有一个绑定.如果没有为类型变量声明绑定,则假定为Object.如果声明了绑定,则它包含:

  • 单个类型变量T,或

  • 类或接口类型T可能后跟接口类型I1&...&In.

如果I1 ... In类型中的任何一个是类类型或类型变量,那么这是一个编译时错误.

所以基本上,如果你的边界包含一个类,它必须是第一个绑定.

(鉴于Arrays无法实例化,不清楚为什么你会想要一个包含它的界限,请注意......这只是一个例子吗?)