在不知道实现的情况下将Abstract Abstract转换为Concrete类型

时间:2010-11-18 11:18:17

标签: java generics casting

考虑代码:

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
}

以上代码是否可行?当我不确定实现是什么时可以进行转换吗?如果是这样,应该如何实现上述功能?

3 个答案:

答案 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