【问题标题】:How to inspect a Parameterized method?如何检查参数化方法?
【发布时间】:2011-10-04 13:56:34
【问题描述】:

我想用这样的方法将数字转换成字符串:

class MathUtils{

    public static <T extends Number> T convert(String str){

       try{
        //convert str depending on the parameter T

       }catch(Exception e){
          e.printStackTrace();
       }
    }
}

然后我调用我的函数:

 Float f = MathUtils.<Float>convert("2");

不幸的是,即使深入调试器,我也不知道如何获取这个 Float 参数。我只能控制 Number,但不能浮动。

有一种方法可以使用ParameterizedType.getActualType()获取o Collection的实际参数,但是参数化方法呢?

谢谢!

【问题讨论】:

  • 定义的方法接受一个字符串(只有一个参数)并返回一个类型为 T 的实例。你为什么要传入两个参数?只需拨打Float f = MathUtils.reconvert&lt;Float&gt;("2");
  • 嗨,我刚一发布就更改了它。我使用方法转换和重新转换进行了不同的测试。但是回复得这么快! :)

标签: java generics parameterized


【解决方案1】:

在java中,由于type erasure,你不能像这样推断泛型类型。您必须将方法签名更改为

public static <T extends Number> T convert(Class<T> clazz, String str){

   if (clazz == Float.class)
   {
       ...
   }
   ...
}

并致电Float f = MathUtils.&lt;Float&gt;convert(Float.class, "2");

【讨论】:

  • 我担心这个:)。有两次 Float 声明信息太多,这就是为什么我更喜欢更漂亮的东西。
  • @NicolasZozol 我知道你在说什么。但不幸的是,在 java 中,您必须这样做(与 c# 不同)。但好消息是你不能这样做 Float f = MathUtils.convert&lt;Integer&gt;(Float.class, "2"); 你会得到一个编译错误。
  • 那么为什么 parameterizedType.getActualTypeArguments 可以与 List 等集合一起使用?
  • @NicolasZozol 这里是ArrayList&lt;T&gt;的来源你能指出你在说哪一部分吗?
  • @Bala R 你的意思是Float f = MathUtils.&lt;Integer&gt;convert(Float.class, "2");,可以写成Float f = MathUtils.convert(Float.class, "2");。仍然是一种残暴的方式。
【解决方案2】:

您需要为每种类型使用不同的方法 - 名称、接口和实现。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2015-05-17
    • 1970-01-01
    • 1970-01-01
    • 2011-03-15
    • 1970-01-01
    • 2013-06-28
    • 1970-01-01
    • 2012-04-19
    相关资源
    最近更新 更多