gpt4 book ai didi

Java 泛型和反射(jenkov 博客)

转载 作者:行者123 更新时间:2023-12-01 18:06:33 26 4
gpt4 key购买 nike

在浏览一些关于 Java 反射和泛型的 Jakov Jenkov 博客时,我发现了以下段落:

When runtime inspecting a parameterizable type itself, like java.util.List, there is no way of knowing what type is has been parameterized to. This makes sense since the type can be parameterized to all kinds of types in the same application. But, when you inspect the method or field that declares the use of a parameterized type, you can see at runtime what type the paramerizable type was parameterized to.

谁能详细说明一下这一段吗?

我对“当运行时检查可参数化类型本身时”这句话感到困惑

最佳答案

考虑以下小程序:

import java.util.ArrayList;

class MyClass {
ArrayList<String> stringList;

public ArrayList<String> getStringList() {
return stringList;
}
}

public class Foo {
public static void main(String... args) throws NoSuchMethodException {
ArrayList<Integer> intList = new ArrayList<>();
System.out.println(intList.getClass().toGenericString());
System.out.println(MyClass.class.getMethod("getStringList").toGenericString());
}
}

该程序的输出是:

public class java.util.ArrayList<E>
public java.util.ArrayList<java.lang.String> MyClass.getStringList()

如您所见,事实上 intListArrayList<Integer>在运行时未知,但事实上 MyClass.getStringList()返回 ArrayList<String>是。

原因是,所有 ArrayList实例(其中一些可能是 ArrayList<Integer> ,其他实例是 ArrayList<String> )共享相同的 Class 。对象:

ArrayList<String> stringList = new ArrayList<>();
ArrayList<Integer> intList = new ArrayList<>();
System.out.println(stringList.getClass() == intList.getClass());

会输出true 。所以intList.getClass()无法知道有关对象的类型参数的任何信息。

另一方面,MyClass.getStringList() 返回的对象始终是一个字符串列表,并且可以在运行时看到这些信息。

关于Java 泛型和反射(jenkov 博客),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/36006795/

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