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

Java如何避免将Class作为泛型对象的参数传递

Java如何避免将Class作为泛型对象的参数传递

翻阅古今 2021-12-10 10:23:40
我写了以下内容:public class DataContainer<Data>{    public DataContainer(Class<Data> clazz, String method) throws NoSuchMethodException, SecurityException{        clazz.getMethod(method);    }}所以我以这种方式创建我的对象:new DataContainer<SomeClass>(SomeClass.class, "get");但我希望它看起来更像:public class DataContainer<Data>{    public DataContainer(String method) throws NoSuchMethodException, SecurityException{        Data.getMethod(method);    }}构造调用应如下所示:new DataContainer<SomeClass>("get");Data在构造 ADataContainer对象时如何避免传递类?我知道Data不能在运行时操作(new DataContainer<>("get");-> 那什么是数据?)但我听说有解决方案可以解决,不幸的是,我似乎还没有用 google 搜索它。这也是我的问题的简化版本,我们假设方法是有效的、公共的并且没有参数。
查看完整描述

1 回答

?
RISEBY

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

由于类型擦除,您想要使用代码的方式实际上是不可能的。


然而,一些通用信息在运行时被保留,即当它可以被反射访问时。一种这样的情况是类层次结构上的泛型,即你可以做这样的事情(我们经常这样做):


//Note that I used T instead of Data to reduce confusion

//Data looks a lot like an actual class name

public abstract class DataContainer<T>{

  public DataContainer(String method) throws NoSuchMethodException, SecurityException {

    Class<?> actualClass = getActualTypeForT();

    //use reflection to get the method from actualClass and call it

  }


  protected Class<?> getActualTypeForT() {

    //get the generic boundary here, for details check http://www.artima.com/weblogs/viewpost.jsp?thread=208860

  } 


//A concrete subclass to provide the actual type of T for reflection, can be mostly empty

public class SomeClassContainer extends DataContainer<SomeClass> {

  //constructor etc.

}

类字段或参数应该有类似的东西,尽管我没有测试过。由于类型擦除,您想要使用代码的方式实际上是不可能的。


然而,一些通用信息在运行时被保留,即当它可以被反射访问时。一种这样的情况是类层次结构上的泛型,即你可以做这样的事情(我们经常这样做):


//Note that I used T instead of Data to reduce confusion

//Data looks a lot like an actual class name

public abstract class DataContainer<T>{

  public DataContainer(String method) throws NoSuchMethodException, SecurityException {

    Class<?> actualClass = getActualTypeForT();

    //use reflection to get the method from actualClass and call it

  }


  protected Class<?> getActualTypeForT() {

    //get the generic boundary here, for details check http://www.artima.com/weblogs/viewpost.jsp?thread=208860

  } 


//A concrete subclass to provide the actual type of T for reflection, can be mostly empty

public class SomeClassContainer extends DataContainer<SomeClass> {

  //constructor etc.

}

类字段或参数应该有类似的东西,尽管我没有测试过。


查看完整回答
反对 回复 2021-12-10
  • 1 回答
  • 0 关注
  • 277 浏览

添加回答

举报

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