这个问题接近this,但存在重大差异。
五月要求:
(1)我想生成一个具有泛型返回值的Java函数。
(2)输入参数列表始终相同。 (与link above不同)。
(3)函数应知道,期望返回参数的类型。
我的尝试:
public <T> T getProperty(String name)
{
T value;
try {
if (T instanceof String) {value = (T) getStringProperty(name);}
if (T instanceof Long) {value = (T) getLongProperty(name);}
if (T instanceof Boolean) {value = (T) getBooleanProperty(name);}
} catch (Exception e) {
LOGGER.error("error at getProperty", e);
}
return value;
}
这不起作用,因为没有生成T
的实例。 T value = new T();
的试验也失败了。
有什么快速解决方法吗?或者不推荐这种方法?
答案 0 :(得分:4)
由于运行时type erasure泛型,因此无法执行此操作。换句话说,在您的情况下,<T>
将被删除为Object
。
您可以像这样传递一个Class-Object来描述返回类型:
public <T> T getProperty(Class<T> returnType,String name){
if (returnType == String.class)
return (T)stringProperty(name);
[...]
}
答案 1 :(得分:0)
从this question和Angelika Langer's Java Generics FAQ的答案中,您会发现您无法检查通用T的类型
所以你要做的就是在方法中传递类型参数或更改你的代码设计。
传递类型参数:
public <T> T getProperty(Class<T> returnType, String name){
if (returnType == String.class)
return (T)stringProperty(name);
[...]
}
或直接调用getStringProperty()
,getLongProperty()
等方法,而不是调用getProperty()
泛型方法。
答案 2 :(得分:0)
你可以这样做: public static Object getValue(Object str){
if(str instanceof String){
return str;
} if(str instanceof Integer){
return str;
} if(str instanceof Long){
return str;
} if(str instanceof Double){
return str;
} if(str instanceof Float){
return str;
} if(str instanceof BigDecimal){
return str;
}
return null;
}
或 public static T getValue(Object str){
if(str instanceof String){
return (T) str;
} if(str instanceof Integer){
return (T) str;
} if(str instanceof Long){
return (T) str;
} if(str instanceof Double){
return (T) str;
} if(str instanceof Float){
return (T) str;
} if(str instanceof BigDecimal){
return (T) str;
}
return null;
}