Подумайте об этом, вам нужен универсальный метод - чтобы он мог обеспечить безопасность типов во время компиляции , но у вас есть только className
во время выполнения;это просто невозможно, или вы действительно не понимаете проблему.Вы можете сделать вид, что он универсальный, например:
public static <T> T convertByteArrayToObject(String className, byte[] data) throws Exception {
Class<?> clazz = Class.forName(className);
Constructor<?> c = clazz.getConstructor(byte[].class);
return (T) c.newInstance(data);
}
Но это приведение бесполезно, и ваш метод действительно возвращает просто Object
, так что вы можете назначить это в вызывающих программах как угодно:
Integer s = convertByteArrayToObject("java.lang.String", new byte[] { 65, 6, 67 });
Так что этот будет компилироваться просто отлично , создавая ложное впечатление о безопасности типов.С другой стороны, вызывающие абоненты, во время выполнения , потерпят неудачу;поскольку внутри их байтового кода есть checkcast
вызовы.Придерживайтесь всего, что у вас есть, и делайте надлежащие проверки.