可以用Java完成吗
public <T> T[] getAttr(String s) {
Object x = getSomething(s);
com.class."s"[] y = (com.class."s"[]) x;
return y;
}
我意识到这一切都很艰难。但基本原则可以用Java实现。
编辑:
伙计我已经拥有了希望返回x
的对象。我只是希望它作为正确的类型返回。即s
答案 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来实现,虽然我遇到了许多警告要小心使用它,因为它可能导致难以预见的效果。