Java泛型嵌套类型参数
我有一个这样定义的类:Java泛型嵌套类型参数,java,generics,Java,Generics,我有一个这样定义的类: 公共类AddRecordsToolbar 扩展抽象工具栏 我的IDEIntelliJ IDEA声明为合法。我觉得它看起来和感觉都不对。 我想这样声明: 公共类AddRecordsToolbar 扩展抽象工具栏 然而,由于与Javas类型擦除有关,这种语法是非法的 D扩展IDataSource是超类所必需的。 我的类正在使用Serializable进行深度复制。因此,T扩展了可序列化性 现在我们来讨论这个问题:如果我指定T extends Serializable作为我的类
公共类AddRecordsToolbar
扩展抽象工具栏
我的IDEIntelliJ IDEA
声明为合法。我觉得它看起来和感觉都不对。
我想这样声明:公共类AddRecordsToolbar
扩展抽象工具栏
然而,由于与Javas类型擦除有关,这种语法是非法的
D扩展IDataSource
是超类所必需的。我的类正在使用Serializable进行深度复制。因此,T扩展了可序列化性
现在我们来讨论这个问题:如果我指定
T extends Serializable
作为我的类的第二个类型参数,它是否还会对D
强制执行T extends Serializable
?回答您的问题,是的
一般参数的顺序只在你的脑海中出现
如果我们将该实施重新表述为:
public class AddRecordsToolbar<T extends Serializable, D extends IDataSource<T>> extends AbstractToolbar<D, T>
public类AddRecordsToolbar扩展了AbstractToolbar
你不会感到惊讶,看起来应该是这样的
我将尝试在Java语言规范中找到对此的解释(当它起作用时),但目前它是这样的 回答你的问题,是的 一般参数的顺序只在你的脑海中出现 如果我们将该实施重新表述为:
public class AddRecordsToolbar<T extends Serializable, D extends IDataSource<T>> extends AbstractToolbar<D, T>
public类AddRecordsToolbar扩展了AbstractToolbar
你不会感到惊讶,看起来应该是这样的
我将尝试在Java语言规范中找到对此的解释(当它起作用时),但目前它是这样的 我相信java语言规范的第8.1.2节已经提到了这一点: 类的类型参数的作用域是 类,包括类型参数节本身。因此,类型 参数可以显示为其自身边界的一部分,也可以显示为的边界 在同一节中声明的其他类型参数
我相信java语言规范的第8.1.2节已经提到了这一点: 类的类型参数的作用域是 类,包括类型参数节本身。因此,类型 参数可以显示为其自身边界的一部分,也可以显示为的边界 在同一节中声明的其他类型参数 对。第二个参数中的“T”与第一个参数中的T相同。否则,世界上没有任何东西是可行的 这意味着
class IFoo extends IDataSource<String>{};
AddRecordsToolbar<IFoo, Integer> x;
类IFoo扩展了IDataSource{};
AddRecordsToolBarX;
这是违法的。Integer和String都是可序列化的,但是AddRecordsToolbar的声明表示数据源必须是第二个参数中数据类型的源。第二个参数表示它必须是可序列化的。是。第二个参数中的“T”与第一个参数中的T相同。否则,世界上没有任何东西是可行的
这意味着
class IFoo extends IDataSource<String>{};
AddRecordsToolbar<IFoo, Integer> x;
类IFoo扩展了IDataSource{};
AddRecordsToolBarX;
这是违法的。Integer和String都是可序列化的,但是AddRecordsToolbar的声明表示数据源必须是第二个参数中数据类型的源。第二个参数表示它必须是可序列化的