【问题标题】:How to convert generic type into String如何将泛型类型转换为字符串
【发布时间】:2019-09-10 21:23:08
【问题描述】:

我正在编写一个使用泛型参数并将它们转换为特定数据类型的函数,添加它们并返回附加值。我已经为整数和双精度做了这个,但不能对字符串做同样的事情

我尝试过使用 toString() 函数以及 String 构造函数,但似乎没有任何效果!

public static <T extends Number> T add(T a, T b) {
        if (a instanceof Integer) {
            return (T) Integer.valueOf(a.intValue() + b.intValue());
        } else if (a instanceof Double) {
            return (T) Double.valueOf(b.doubleValue() + b.doubleValue());
        } else if (a instanceof String) {
            return  (T) String.valueOf(a.toString() + b.toString());
        }

    }

我希望它应该返回泛型类型参数,但它会引发几个编译时错误:

java: incompatible types: T cannot be converted to java.lang.String

和

ava: incompatible types: java.lang.String cannot be converted to T

【问题讨论】:

  • public static &lt;T extends Number&gt; String add(T a, T b)
  • 如果T extends Number a instanceof String 会是真的吗?
  • 另外:在像这样的泛型方法中使用instanceof 忽略了泛型的意义。
  • 泛型的意义在于设计出能够不管 T 的实际类型如何工作的方法。不要编写仅在 T 为 Integer 或 Double 时才有效且对所有其他 Number 类型均失败的方法。你想要做的事情是不可能用泛型做的。
  • 想想ArrayList&lt;T&gt;,列表不需要知道您存储的对象的类型,因为它为所有类型提供了通用功能。拥有一个 ArrayList 根据对象的类型以不同的方式存储东西,有点违背了目的。您可以使用泛型加上继承或 IMO 重载每种类型的方法来解决您尝试解决的问题。

标签: java string generics


【解决方案1】:

您的通用类型T 被声明为扩展Number。 String 不扩展 Number。这是你问题的根源。您的传入参数a 和b 扩展编号,因此可能不是String 类型,或者您的T 泛型类型可能不扩展Number。

另一种解决方案是让您的方法保持原样,而不是在那里处理String 类型并添加另一个接收2 String 参数的方法。但是,请注意,添加 2 个字符串只是将它们连接起来,因此“2”+“4”会给你“24”,这可能不是你想要/期望的。如果您希望字符串代表数值,则需要编写自己的代码来将 String 参数解析为 Integer 或 Long 或 Number 接口的其他实现,然后将它们相加

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2021-10-25
    • 2012-12-14
    • 1970-01-01
    • 2011-06-29
    • 2010-09-05
    • 2021-09-23
    • 1970-01-01
    • 2012-09-19
    相关资源
    最近更新 更多