Java 静态法中的有界型参数
这两种方法等效吗Java 静态法中的有界型参数,java,generics,Java,Generics,这两种方法等效吗 public static <T extends com.google.protobuf.Message> Any pack(T message) {} public static Any pack(com.google.protobuf.Message message) {} publicstaticanypack(T消息){ 公共静态任意包(com.google.protobuf.Message){} 我的理解是,在第一个函数中,T仅适用于该静态方法,而不适
public static <T extends com.google.protobuf.Message> Any pack(T message) {}
public static Any pack(com.google.protobuf.Message message) {}
publicstaticanypack(T消息){
公共静态任意包(com.google.protobuf.Message){}
我的理解是,在第一个函数中,T仅适用于该静态方法,而不适用于其他静态方法或类。因此,它仅将输入参数限制为消息的子类型。是这样吗?如果是这种情况,这两个方法是等效的吗?是的,假设调用者不提供显式类型见证,这两个签名是等效的。这是因为,在没有类型见证的情况下,两个签名都接受相同的参数集:
public static <T extends com.google.protobuf.Message> Any pack(T message) {}
public static Any pack(com.google.protobuf.Message message) {}
- 第一个签名接受的任何参数必须是
的实例,T
是T
的子类型,因此该参数也必须是Message
的实例,并被第二个签名接受Message
- 第二个签名接受的任何参数都必须是
的实例,因此如果选择消息
作为T
消息
t
执行任何操作(例如,将其用作返回值),则它们是相等的。请注意,泛型是不变的。因此,如果您使用类似于List
和List
的东西,它们会有所不同。但在这种情况下,如果你不这样做,实际上没有什么区别。虽然在重载和编译器的最佳匹配方面可能存在一些细微的差异,但这些可能与您无关。