gpt4 book ai didi

java - 在 Java 中,为什么数组不能是类型变量的边界,但可以是通配符的边界?

转载 作者:塔克拉玛干 更新时间:2023-11-03 02:56:44 26 4
gpt4 key购买 nike

在 Java 中,为什么数组不能是类型变量的边界,但可以是通配符的边界?

你可以拥有:

List< ? extends Integer[] > l;

但你不能:

class MyClass< T extends Integer[] > { } // ERROR!

为什么?

最佳答案

考虑这段 Java 代码:

package test;

public class Genric<E>
{
public Genric(E c){
System.out.println(c.getClass().getName());
}
public static void main(String[] args) {
new Genric<Integer[]>(new Integer[]{1,2});
}
}

对于您的第一个案例:

List< ? extends Integer[] > l;

当你做这样的事情时 List< ? extends Integer[] > l;然后 Java 编译器将其视为 List< ? extends Object> l;并相应地进行翻译。所以这就是为什么您没有收到任何错误的原因。

生成的字节码如下:

   .
.
.
20: aastore
21: invokespecial #52; //Method "<init>":(Ljava/lang/Object;)V
24: return
.
.

检查行号 21。虽然,我传递了一个 java.lang.Integer 的数组;在内部它被翻译成java.lang.Object .

对于你的第二种情况:

class MyClass< T extends Integer[] > { } // ERROR!

根据 java 语言规范:

TypeParameter:
TypeVariable TypeBoundopt

TypeBound:
extends ClassOrInterfaceType AdditionalBoundListopt
.
.

如您所见,绑定(bind)仅由类或接口(interface)组成(甚至不包括原始类型)。所以当你做这样的事情时 class MyClass< T extends Integer[] > { }然后Integer[]不符合类或接口(interface)的条件。

根据我对 Java 规范的理解,这样做是为了解决所有场景,例如

  1. class MyClass< T extends Integer[] >
  2. class MyClass< T extends Integer[][] >
  3. ..
  4. class MyClass< T extends Integer[][]...[] >

因为它们都可以表示为java.lang.Object当作为参数传递时,如示例

public Genric(E c){
System.out.println(c.getClass().getName());
}

因为 'c' 记住它的真实类型。

希望这会有所帮助。

关于java - 在 Java 中,为什么数组不能是类型变量的边界,但可以是通配符的边界?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/4775097/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com