当前位置: 首页 > 知识库问答 >
问题:

Java中数组和泛型的类型规则

空俊语
2023-03-14

在有效Java(第2版)第25项的最后一段中说:

共有1个答案

郎祯
2023-03-14

你没有提到如果你对某个特定的概念感到困惑,所以我将试着给出协方差和不变性的基本定义

协方差保留类型顺序,不变性不保留。这意味着子类型被保留或不被保留(在逆变的情况下被颠倒)。

因此,如果您有以下类

public class A {

  public void go() {

    System.out.println("A");
  }
}

还有...

public class B extends A {

  @Override
  public void go() {

    System.out.println("B");
  }
}

对于协变类型(例如数组),函数

public static void go(A[] as) {

  for (A a : as)
    a.go();
}

完全有效用作

A[] as = new A[8];
B[] bs = new B[8];

go(as);
go(bs);

换句话说,数组类型被公开给运行库或被具体化。

对于不变类型(例如泛型),不保留子类型。因此,例如,xx没有类型关系,而不是x。这在一定程度上是泛型类型未公开给运行库或未擦除的结果。

但是,您仍然可以分别使用extendssuper在Java中显式地表示协方差和逆方差。例如使用类

public class X<T extends A> {

  private T t_;

  public X(T t) {
   t_ = t;
  }

  public void go() {

    t_.go();
  }
}

该功能

public static void go(X<?> x) {

  x.go();
}

将有效用作

X<A> xa = new X<A>(a);
X<B> xb = new X<B>(b);

go(xa);
go(xb);

 类似资料:
  • 问题内容: 我正在尝试创建一个泛型类型的数组。我收到错误消息: 我很困惑。任何线索为什么会这样。 问题答案: 其背后的原因是,您不能创建通用或参数化类型的数组,而只能 创建可验证的 类型(即可以在运行时推断出的类型)。 尽管可以将此类数组类型 声明 为变量或方法参数。这有点不合逻辑,但这就是Java的样子。 Java泛型和集合在第6章中广泛讨论了此问题和相关问题。

  • 问题内容: 因此,我正在开发这个通用的HashTable类,并且希望将其通用地用于任何数量的传入类型,并且我还想将内部存储数组初始化为LinkedList的数组(出于冲突目的),其中为确保类型安全,每个LinkedList都被预先指定为HashTable类中的泛型类型。我该怎么做?以下代码最能阐明我的意图,但当然不会编译。 问题答案: Java中的泛型不允许创建具有泛型类型的数组。您可以将数组转换

  • 问题内容: 我最近开始学习JAVA泛型。一切都说得通,我现在有点理解。但是有一件事让我烦恼-您无法创建通用类型的数组。 我想实现诸如队列和堆栈之类的抽象数据类型,但是要使用某种通用类型作为存储在堆栈中的基础数据。我将如何解决?我确定我想念但那是什么? 提前致谢。 问题答案: 《有效的Java》,第5章,GENERICS,第25项:首选列表而不是数组 : 数组在两个重要方面不同于通用类型。首先,数组

  • 我试图创建一个Java方法,它接受一个对象类型和它应该转换成的数据类型。 例如,如果我应该能够返回一个值1作为Int或双根据需要。我使用类传递数据类型作为参数。 问题:如何使方法泛型以接受基于输入参数的返回类型? 下面的代码只是一个示例,它可能在语法上不正确,用于解释我的问题。

  • 我不想为每个类型T编写这个方法只是为了调用getMessage()并将其传递给下一个方法。 有可能写出这样的方法吗?我只想访问ConstraintViolation接口的方法,这些方法不依赖于类型T(如字符串getMessage())。

  • 问题内容: 我的任务是用Java编写哈希表,该哈希表必须适用于任何数据类型。我正在编写的代码规则如下:-哈希表必须具有一个数组作为基础数据结构,其大小在构造对象时确定- 发生冲突时,应该放置碰撞的元素链接列表,该列表包含哈希表中该索引(键)处的所有元素 因此,对于基础数据类型,我做了一个LinkedList类型的数组(自定义,不是Java API LinkedList)。 当然,问题是实例化此数组