首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >java中的类型参数化是什么意思?

java中的类型参数化是什么意思?
EN

Stack Overflow用户
提问于 2015-03-13 15:34:58
回答 5查看 68关注 0票数 0

在阅读JVM的时候..。我穿过了这些线

JVM对类型参数一无所知。Java编译器删除所有类型参数,并将其替换为类型对象。然后,参数类型T的数组成为JVM上下文中的对象数组,这就是为什么不能编写像新Tn这样的表达式。

这是不是意味着当我写

职能(Int a)

A被类型对象替换,即用Integer对象替换?或者int[10];变成了Integer[10];,如果不是这样的话,它意味着什么?

请用简单的术语来解释。

EN

回答 5

Stack Overflow用户

发布于 2015-03-13 15:39:46

类型擦除仅指仿制药。像Function(int a)这样的方法不会受到影响。

另一方面,该代码将:

代码语言:javascript
复制
public class Node<T> {

    private T data;
    private Node<T> next;

    public Node(T data, Node<T> next) }
        this.data = data;
        this.next = next;
    }

    public T getData() { return data; }
    // ...
}

将由以下内容取代:

代码语言:javascript
复制
public class Node {

    private Object data;
    private Node next;

    public Node(Object data, Node next) {
        this.data = data;
        this.next = next;
    }

    public Object getData() { return data; }
    // ...
}

(取自这里的例子)

票数 3
EN

Stack Overflow用户

发布于 2015-03-13 15:39:30

Java编译器删除所有类型参数,并将其替换为类型对象。

本文专门讨论泛型类中的类型参数。所以如果您编写的方法如下所示

代码语言:javascript
复制
public <T> void foo(T arg);

生成的方法中的arg类型将是java.lang.Object。非一般方法保持不变。

这是否意味着当我编写function(int a) a时被替换为类型对象,即Integer对象?

没有,因为规则只适用于使用泛型类型参数作为参数或返回类型的泛型类的泛型方法和方法。

因此,如果我的List<>应该存储String,如果有关String的信息被删除并转换为Object,那么JVM如何知道它应该接受String来存储在List<>中,以及如何检查呢?

JVM不知道也不检查列表中的对象类型,因为它没有相关的信息。泛型类型参数的所有类型检查都是在编译时完成的。JVM知道在运行时进入列表的对象实际上是String的,因为编译器确保所有类型安全的代码路径都将字符串放入列表中。另一方面,您可以通过类型转换列表或使用它的非一般方法来欺骗编译器,让您将无效对象放置到列表中(例如,Integers到列表的Strings中),但是对编译器的愚弄则是对您的蓄意操作。

有关类型擦除的更多信息,请参见本教程

票数 2
EN

Stack Overflow用户

发布于 2015-03-13 15:39:25

您弄错了:类型擦除与Java泛型相关。

如果编写类似于List<String> l = new ArrayList<String>();的内容,则在编译过程中删除有关String的信息;JVM将不知道任何有关它的信息。

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/29036298

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档