java - 如何在Java泛型中返回类对象“类型”? [复制]

Posted

技术标签:

【中文标题】java - 如何在Java泛型中返回类对象“类型”? [复制]【英文标题】:How to return a class object "type" in java generics? [duplicate] 【发布时间】:2014-06-18 06:40:35 【问题描述】:

想象有一个java类

public class FixedClassOfStrings 

  List<String> myMember=new ArrayList<String>();

  // omissed all non relevant code...

  public Class getMyType() 
    return String.class;
  

如何通过使用 java 泛型使其参数化?

我的尝试失败了:

public class GenericClass<T> 

  List<T> myMember=new ArrayList<T>();

  public Class getMyType() 
    return T.class; // this gives "Illegal class literal for the type parameter T"
  

另外,我怎样才能避免警告:“类是原始类型。对泛型类的引用应该被参数化”在 FixedClassOsStrings 中?是否可以声明:

  public Class<String> getMyType() 
    return String.class;
  
  ...

如果没问题,我应该使用泛型返回什么?

  public Class<T> getMyType() 
    return T.class; // this gives "Illegal class literal for the type parameter T"
  
  ...

所有提示将不胜感激!!!

【问题讨论】:

T.class 是一个编译时常量,我认为,但由于代码是通用的,编译器无法确定要返回什么类对象。 非常类似于下面的问题***.com/questions/3437897/… 【参考方案1】:

我会尝试这样的:

public Class<T> getMyType() 
    return /* some instance of T */.getClass();

另外,一个简单的解决方案是在构造时传递实例:

public class YourClass<T> 

    private final Class<T> type;

    public YourClass (/* arguments */, Class<T> type) 
        this.type = type;
    

    public Class<T> getType() 
        return this.type;
    


【讨论】:

这不是类型安全的。 “T的某个实例”可以是null,或者它的类可以是T的子类。 另外,/* some instance of T */.getClass() 的类型为 Class&lt;? extends T&gt;,而不是 Class&lt;T&gt;

以上是关于java - 如何在Java泛型中返回类对象“类型”? [复制]的主要内容,如果未能解决你的问题,请参考以下文章

Kotlin 泛型中的 in 和 out

如何在 Java 泛型中获取类型变量的类

Java泛型中extends和super的理解(转)

Java中的泛型的问题?

java 怎么获取list泛型里的对象类型

java 泛型中的T和?