在Java泛型中,泛型类型的专门化是如何受到限制的?

在Java泛型中,泛型类型的专门化是如何受到限制的?,java,generics,programming-languages,computer-science,Java,Generics,Programming Languages,Computer Science,从 在Java泛型中,泛型类型定义基本上转换为一个在所有允许的类型参数组合中共享的具体泛型类型。因此,多个(源代码级别)类型被映射到一个(二进制级别)类型-但结果是,有关实例的类型参数的信息在该实例中被丢弃(类型擦除) 运行时可用的类型信息(使用反射)丢失。这反过来意味着泛型类型的专门化(对任何特定泛型参数组合使用专门化源代码的能力)非常有限 “可能在运行时可用(使用反射)的类型信息丢失”的后果是什么 “泛型类型的专门化(对任何特定泛型参数组合使用专门化源代码的能力)非常有限”是什么意思 也许有

在Java泛型中,泛型类型定义基本上转换为一个在所有允许的类型参数组合中共享的具体泛型类型。因此,多个(源代码级别)类型被映射到一个(二进制级别)类型-但结果是,有关实例的类型参数的信息在该实例中被丢弃(类型擦除)

运行时可用的类型信息(使用反射)丢失。这反过来意味着泛型类型的专门化(对任何特定泛型参数组合使用专门化源代码的能力)非常有限

“可能在运行时可用(使用反射)的类型信息丢失”的后果是什么

“泛型类型的专门化(对任何特定泛型参数组合使用专门化源代码的能力)非常有限”是什么意思

也许有一些例子


谢谢。

我将从一个名为
GenericTest
的简单示例开始。此类尝试查找
ArrayList
中使用的参数类型

public class GenericTest {

    // Result would be the same if I have used wildcard (?) instead,
    // public static void findType(ArrayList<?> list)
    public static void findType(ArrayList list) {
        System.out.println(Arrays.toString(
                list.getClass().getTypeParameters()));
    }

    public static void main(String[] args) {
        findType(new ArrayList<Integer>());
        findType(new ArrayList<String>());
    }
}
相反,我们得到了用作参数占位符的标识符

[E]
[E]
因此,在Java中,您不知道用于创建
ArrayList
的特定实例的实际类型参数。这是因为Java泛型是使用擦除实现的

这意味着特定类型信息将从泛型中删除。你唯一能确定的是你正在使用一个对象

这与C++的模板世界截然不同


还有一些不同之处,但我将不在此赘述。

不完全是重复的,在不同的网站上,但有很多好的答案,谢谢。在
publicstaticvoidfindtype(ArrayList列表)
中,您是否必须指定类型参数,即
publicstaticvoidfindtype(ArrayList列表)
?不,在使用泛型类时,您从不指定
t
T
(或任何其他字母或单词)是类型定义期间使用的类型参数。相反,您可以使用
(通配符)或具体类型,例如
公共静态void findType(ArrayList)
。在我的例子中,我没有。如果我用过的话,结果也一样。谢谢。
public static void findType(ArrayList list)
中的
ArrayList list
是否与实例化
ArrayList list
相同?它与
ArrayList list
相同。它将接受
java.lang.Object
,但您不能将其声明为
ArrayList
。谢谢。为什么我不能将其声明为
ArrayList
对象
不是具体类型吗?
ArrayList
是带有某种类型参数的泛型
ArrayList
的实例化吗?
[E]
[E]