为了账号安全,请及时绑定邮箱和手机立即绑定

如何获得T型泛型的类实例

如何获得T型泛型的类实例

慕无忌1623718 2019-06-06 11:09:36
如何获得T型泛型的类实例我有个仿制类,Foo<T>..用一种方法Foo,我想获得类型T的类实例,但我不能调用T.class.使用T.class?
查看完整描述

3 回答

?
拉莫斯之舞

TA贡献1820条经验 获得超10个赞

简单地说,在Java中找不到泛型参数的运行时类型。我建议阅读关于类型擦除的一章。Java教程更多细节。

这方面的一个流行解决方案是传递Class将类型参数转换为泛型类型的构造函数,例如

class Foo<T> {
    final Class<T> typeParameterClass;

    public Foo(Class<T> typeParameterClass) {
        this.typeParameterClass = typeParameterClass;
    }

    public void bar() {
        // you can access the typeParameterClass here and do whatever you like
    }}


查看完整回答
反对 回复 2019-06-06
?
RISEBY

TA贡献1856条经验 获得超5个赞

然而,有一个小漏洞:如果您定义Foo类作为抽象类。这意味着必须将类实例化为:

Foo<MyType> myFoo = new Foo<MyType>(){};

(请注意末尾的双大括号。)

现在您可以检索T在运行时:

Type mySuperclass = myFoo.getClass().getGenericSuperclass();Type tType = ((ParameterizedType)mySuperclass).getActualTypeArguments()[0];

不过,请注意mySuperclass必须是类定义的超类,实际上定义了T.

它也不是很优雅,但是你必须决定你是否更喜欢。new Foo<MyType>(){}new Foo<MyType>(MyType.class);在你的密码里。


例如:

import java.lang.reflect.ParameterizedType;import java.lang.reflect.Type;import java.util.ArrayDeque;import java.util.Deque;
import java.util.NoSuchElementException;/**
 * Captures and silently ignores stack exceptions upon popping.
 */public abstract class SilentStack<E> extends ArrayDeque<E> {
  public E pop() {
    try {
      return super.pop();
    }
    catch( NoSuchElementException nsee ) {
      return create();
    }
  }

  public E create() {
    try {
      Type sooper = getClass().getGenericSuperclass();
      Type t = ((ParameterizedType)sooper).getActualTypeArguments()[ 0 ];

      return (E)(Class.forName( t.toString() ).newInstance());
    }
    catch( Exception e ) {
      return null;
    }
  }}

然后:

public class Main {
    // Note the braces...
    private Deque<String> stack = new SilentStack<String>(){};

    public static void main( String args[] ) {
      // Returns a new instance of String.
      String s = stack.pop();
      System.out.printf( "s = '%s'\n", s );
    }}


查看完整回答
反对 回复 2019-06-06
  • 3 回答
  • 0 关注
  • 1053 浏览

添加回答

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信