【问题标题】:Name of Class <T> of a generic Class泛型类的类 <T> 的名称
【发布时间】:2011-12-18 23:12:23
【问题描述】:

在使用泛型时,我在 java 中遇到了一个小问题。我有一个 A 类:

public class A<T>

在A的一个方法中,我需要得到T的类型名。有没有办法用T找到字符串s?

(如果我创建 A&lt;String&gt; temp = new A&lt;String&gt;();,我希望能够在某一时刻获取 java.lang.String - 我必须使用泛型,因为我的方法之一必须返回一个列表)。

这似乎很容易,但我不知道该怎么做。

非常感谢您的帮助。

【问题讨论】:

    标签: java generics


    【解决方案1】:

    由于type erasure,这是不可能的。

    相反,您需要在构造函数中接受 Type&lt;T&gt;

    【讨论】:

    • 哇。我只是编写具有相同要求的东西。得到了this,它使用了课堂上某个领域的知识。
    • (如果我创建 A temp = new A();,我希望能够得到 java.lang.String
    • @yassiro:我知道。但是,这是不可能的。相反,你需要写A&lt;String&gt; temp = new A&lt;String&gt;(String.class);
    • 你试试吧!! System.out.println(x.getClass().getName());它给了我通用类“A”的名称
    • @yassiro:正确。您需要检查作为参数传递的Type 实例。
    【解决方案2】:

    这是不可能的,因为泛型是使用“擦除”实现的:内部实际上只有一个 A 类,而 &lt;String&gt; 在运行时之前被“擦除”。根据我的经验,最好的解决方案是添加一个私有 final 字段 Class&lt;T&gt; tClass,并要求在构造函数中指定它:

    public A(final Class<T> tClass)
    {
        this.tClass = tClass;
    }
    

    然后你必须写

    A<String> temp = new A<String>(String.class);
    

    而不仅仅是

    A<String> temp = new A<String>();
    

    【讨论】:

    • (如果我创建 A temp = new A();,我希望能够得到 java.lang.String
    • @yassiro:是的,我明白这一点。不幸的是,你强迫我引用滚石乐队的话:“你不能总是得到你想要的/但如果你有时尝试你可能会发现/你得到你需要的。”您想要 new A&lt;String&gt;() 在运行时以某种方式记录String;但你不能明白。那么问题来了,如何获得需要的
    • 我想要一个动态 Jtable(这个 JTable 可以显示许多不同的对象 "person","Student" )所以我创建了一个通用的 TableModel 然后我想要一个类 T 的名称获取 T 类的字段!!!这是我的愿景,如果有人需要代码来理解我的意思,我会将其发送给他*
    猜你喜欢
    • 2022-01-01
    • 1970-01-01
    • 2016-01-12
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2017-06-29
    相关资源
    最近更新 更多