如何在Java泛型中返回类对象“类型”?

6
想象一下有一个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"
  }
}

此外,我该如何避免警告:“Class is a raw type. References to generic type Class should be parameterized”在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 是一个编译时常量,但由于代码是泛型的,编译器无法确定返回哪个类对象。 - awksp
1
非常类似于以下问题 https://dev59.com/vnA75IYBdhLWcg3wKluM - GoldenJam
1个回答

3
我会尝试使用以下方式:
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 的某些实例" 可能为空或其类可能是 T 的子类。 - newacct
1
此外,/* T 的某个实例 */.getClass() 的类型为 Class<? extends T>,而不是 Class<T> - newacct

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接