考虑代码:
Number n=new Integer(20);
cast(n) //return's n casted to Integer
<T> T cast(Number num)//to cast from abstract to concrete implemenation
{
// Get which implementation of Number this by calling num.getClass()
//cast to Specific implementation and return
}
以上代码是否可行?当我不确定实现是什么时可以进行转换吗?如果是这样,应该如何实现上述功能?
答案 0 :(得分:0)
由于删除,T
将被编译为Object
,结果将是(Object)
广告。
(我在SO上看到了一个类似的问题,有更详细的解释。但现在找不到它。)
然而,这编译。我看不出它会如何有用,但也许你可以:)
class Main {
public static void main(String[] args) {
Number n = new Integer(20);
Integer i = cast(n); //return's n casted to Integer
}
static <T> T cast(Number num) {
return (T) num;
}
}
答案 1 :(得分:0)
施放会影响不在对象上的对象类型。
所以你的方法
cast(n)
什么都不做
答案 2 :(得分:0)
最好的选择是这样做:
<T extends Number> T cast(Number num) {
return (T) num;
}
或者,更好的方法,它有点脏,但你明白了......
/**
* @author The Elite Gentleman
*
*/
public class Test {
/**
*
*/
public Test() {
// TODO Auto-generated constructor stub
Number n = new Integer(20);
Double t = cast(n, Double.class);
System.out.println(t);
}
@SuppressWarnings("unchecked")
public <T extends Number> T cast(Number num, Class<T> clazz) {
if (num instanceof Integer) {
return specificCast(num.intValue(), clazz);
}
// if (num instanceof Double) {
// return specificCast(num.doubleValue(), clazz);
// }
return (T) num;
}
@SuppressWarnings("unchecked")
private <T extends Number> T specificCast(int value, Class<T> clazz) {
if (clazz != null) {
if (clazz == Float.class) {
return (T)Float.valueOf((float)value);
}
if (clazz == Double.class) {
return (T)Double.valueOf((double)value);
}
if (clazz == Long.class) {
return (T)Long.valueOf((long)value);
}
if (clazz == Short.class) {
return (T)Short.valueOf((short)value);
}
if (clazz == Integer.class) {
return (T)Integer.valueOf(value);
}
}
return null;
}
public static void main(String[] args) {
new Test();
}
}
...输出
20.0