当前位置: 首页 > 面试题库 >

java泛型边界类型

柯昱
2023-03-14
问题内容

以下两个签名是否相同?

public static <T> void work(Class<T> type, T instance);

public static <T, S extends T> void work(Class<T> type, S instance);

问题答案:

不,两个签名不相同。根据Java语言规范的第8章:

如果两个方法具有相同的名称和参数类型,则它们具有相同的签名。

如果满足以下所有条件,则两个方法或构造函数声明M和N具有相同的参数类型:

  • 它们具有相同数量的形式参数(可能为零)
  • 它们具有相同数量的类型参数 (可能为零)

由于两种方法共享的类型参数数量不同,因此签名也不相同。

在实际情况下,使用隐式类型参数调用方法时,它们可能被视为可互换的。但这仅在源代码级别,而不在二进制级别。换句话说,如果您work()在类中具有一个类型参数的版本,并且在类中Foo被一个方法调用Bar,然后切换到的两个类型参数的版本work()并重新编译Foo,则还需要重新编译Bar

编辑

@onepotato问:

如果它们没有相同的签名,那么为什么当我将它们复制并粘贴到一个类中时,Eclipse告诉我它们具有相同的方法签名?

两个签名 相等 和两个签名 冲突 (“等效”)之间存在区别。如果一个签名是另一个的子签名,则两个签名冲突。稍后在同一部分中对此进行说明:

当m1是m2的子签名或m2是m1的子签名时,两个方法签名m1和m2是等效的。

在类中声明两个具有重写等效签名的方法是编译时错误。

如果满足以下任一条件,则方法m1的签名是方法m2的签名的子签名:

  • m2与m1具有相同的签名,或者
  • m1的签名与m2的签名的擦除(第4.6节)相同。



 类似资料:
  • 编译以下Java代码: 此外,编译以下代码: 以下代码将给我一个编译错误: 因此,看起来,如果其中一个边界类型本身是类型参数,就不可能有多个边界。但为什么呢? 据我所知,如果声明了多个边界,那么最多一个边界可能是一个类(其他所有边界都是接口),并且它必须是第一个边界。 但是,既然在我的示例中是一个接口,为什么编译器会抱怨呢?毕竟,T是接口还是类应该没有任何区别。 我试图在网上找到答案,但显然我的谷

  • 在了解Java泛型的过程中,我遇到了以下问题: 假设我有下面的方法来添加列表的元素,只限于包含数字的列表。 但是这段代码和这段代码有什么不同: 它们都按预期编译和执行。这两者之间有什么区别?除了语法之外?什么时候我更喜欢使用通配符而不是前者? 是的,使用通配符方法,我不能在列表中添加除null之外的新元素,否则它将无法编译。除此之外呢?

  • 我知道在Java泛型中,当使用具有多个边界的类型参数时,编译器会将类型信息擦除到“最左边的边界”(即列表中的第一个类/枚举或接口)。那么为什么以下代码编译没有问题呢? 类型参数不应该被视为对象吗??(因此不允许我调用close()或append())??

  • 本文向大家介绍Java泛型extends关键字设置边界的实现,包括了Java泛型extends关键字设置边界的实现的使用技巧和注意事项,需要的朋友参考一下 本文主要介绍在泛型定义中的< >中的占位符如何配合extends关键字使用,形如<T extends Integer>。泛型定义存在于这三种形式中:泛型类、泛型接口、泛型方法。 一般的泛型定义中的<T>,相当于<T extends Object

  • 如何获取这个类的类型?对于上下文,我使用ModelMapper,我需要类类型T从S转换为T。 背景: 我已经尝试了N种方法,其中我放置了“//一些方法来获取类型”,但没有任何效果。例如: 或

  • 问题内容: 您好直接从Oracle http://docs.oracle.com/javase/tutorial/collections/interfaces/collection.html提供的Java教程中 我知道编译时的类型擦除。而且我也知道,一个类型(无界)将被Object取代。知道在编译时如何使用无界通配符进行编译吗?只是删除它,因为它是原始类型? 提前致谢。 问题答案: 假设我们有一个