[java] объект Class примитивный тип конвертнуть в объект Class враппер

psihodog

Как по объекту типа Class представляющий примитивный тип, сделать объект представляющий враппер этого типа?
Т.е., например, если был в переменной объект Boolean.TYPE, то мы пихнём туда Boolean.class, ну и т.д.

psihodog

Или можно ли сразу по объекту конструктора получить список типов аргументов с автоматически врапнутыми примитивами?

enochka1145

Ничего не понял, но в Java 5 можно сделать так:
Number number = 5;
Для boolean это не прокатит.
Напиши поподробней, что требуется, желательно с псевдокодом.

sasha79

Как по объекту типа Class представляющий примитивный тип, сделать объект представляющий враппер этого типа?
Примитивных типов мало, сделай руками map и с его помощью преобразовывай.

psihodog

Я так и делаю. Но, вроде, задача стандартная. Должна же быть какая-то заготовка?

psihodog


Constructor c= Class.forName(argv[0]).getConstructors[new Integer(argv[1])];
Class[] argtype= c.getParameterTypes;
Object[] arg= new Object[argtype.length];
Class[] ClArStr= {String.class};
wrapPrimitives(argtype); // Вот если этого не делать, то на стадии исполнения будут ошибки, если в конструкторе есть примитивные типы
for (int i= 0; i<arg.length; ++i) {
Object thisArg[]= {argv[i+2]};
arg[i]= argtype[i].getConstructor(ClArStr).newInstance(thisArg);
}

psihodog

Соответсвенно,
	static void wrapPrimitives(Class[] argtype) {
HashMap<Class,Class> wrap= new HashMap<Class,Class>
wrap.put(Boolean.TYPE , Boolean.class);
wrap.put(Character.TYPE, Character.class);
wrap.put(Byte.TYPE , Byte.class);
wrap.put(Short.TYPE , Short.class);
wrap.put(Integer.TYPE , Integer.class);
wrap.put(Long.TYPE , Long.class);
wrap.put(Float.TYPE , Float.class);
wrap.put(Double.TYPE , Double.class);
wrap.put(Void.TYPE , Void.class);

for (int i= 0; i<argtype.length; ++i)
if (argtype[i].isPrimitive
argtype[i]= wrap.get(argtype[i]);
}

enochka1145

Ну, могу предложить такое решение:
public class Test {

public static void main(String[] args) throws ClassNotFoundException {
System.out.println(ensureNonPrimitive(void.class;
System.out.println(ensureNonPrimitive(Void.class;
}

private static Class ensureNonPrimitive(Class klass) throws ClassNotFoundException {
if (klass.isPrimitive {
String className = klass.getName;
return Class.forName(
"java.lang." + (className.substring(0, 1).toUpperCase + className.substring(1;
}
return klass;
}
}

enochka1145

Специально замечу, если это не очевидно - ensurePrimitive может работать с Map-ом, который наполнен в начале работы программы на манер приведённой выше ensurePrimitive

sasha79

int Integer

psihodog

ага
решение 'а -- это первое, о чём подумал, но его (решения а не 'а ) тормознутость и int<->Integer меня остановили.

enochka1145


А меня, главное, тоже не оставляло чувство, что не всё так просто. И вообще, надо было сначала написать нормальный -тест.
В смысле, public class WrapperTest extends junit.framework.TestCast { ... }, а не то, что вы подумали.

enochka1145

Да, еще char <=> Character
Оставить комментарий
Имя или ник:
Комментарий: