Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/316.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 静态法中的有界型参数_Java_Generics - Fatal编程技术网

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
的东西,它们会有所不同。但在这种情况下,如果你不这样做,实际上没有什么区别。虽然在重载和编译器的最佳匹配方面可能存在一些细微的差异,但这些可能与您无关。