【问题标题】:How to return a class object "type" in java generics? [duplicate]java - 如何在Java泛型中返回类对象“类型”? [复制]
【发布时间】: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 是一个编译时常量,我认为,但由于代码是通用的,编译器无法确定要返回什么类对象。
  • 非常类似于下面的问题stackoverflow.com/questions/3437897/…

标签: java class generics types return


【解决方案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;
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2022-10-14
  • 2015-05-16
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多