基于传入的字符串在对象中强制转换

时间:2011-08-17 10:23:04

标签: java class templates casting

可以用Java完成吗

public <T> T[] getAttr(String s) {
    Object x = getSomething(s);
    com.class."s"[] y = (com.class."s"[]) x;
    return y;
}

我意识到这一切都很艰难。但基本原则可以用Java实现。

编辑:

伙计我已经拥有了希望返回x的对象。我只是希望它作为正确的类型返回。即s

的班级版本

4 个答案:

答案 0 :(得分:2)

获取课程

Class<?> theClazz = Class.forName("com.class."+s);

创建指定运行时类型和长度的数组:

java.lang.reflect.Array.newInstance(theClazz, length);

你将不得不压制一些关于类型安全的警告。如果你真的想从Strings那里出发,那就没办法了。也许传入一个Class对象,然后它就可以成为类型安全的。

答案 1 :(得分:1)

这是非常类型的不安全方法:

return (T[]) java.reflect.Array.newInstance( Class.forName( "com.class" + s, n );

答案 2 :(得分:1)

这是完全合法的

public class Test {
    public static void main (String[] args) {

        Object o = new String("abc123");

        try {
            String s = cast(o, "java.lang.String");
            System.out.println(s);
        } catch (ClassNotFoundException e) {
            e.printStackTrace();
        }
    }

    public static <T> T cast(Object o, String clazz) throws ClassNotFoundException {
        return (T) Class.forName(clazz).cast(o);
    }
}

问题是,你会完成什么?真的没什么。当然,您可以基于字符串(Class.cast(...))强制转换对象,但是您仍然需要在编译时将输出声明为String。运行时类型和编译时类型之间的区别。而且java是强类型的。编译器不会尝试将字符串转换为类型,而泛型是严格编译时的。

答案 3 :(得分:0)

我认为这可以使用JAVA Reflection API来实现,虽然我遇到了许多警告要小心使用它,因为它可能导致难以预见的效果。