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