Я хотел бы понять, почему следующее не работает:Динамическое создание экземпляра без дженериков
public class HelloClass {
private class MyClass
{
public MyClass()
{
System.out.println ("Oh heck this is me!");
}
}
public Object newInstance (Object o)
{
try {
// java.lang.InstantiationException here
return o.getClass().newInstance();
} catch (Exception e) {
e.printStackTrace(System.out);
return null;
}
}
public void run()
{
MyClass m = new MyClass();
Object o = newInstance(m);
}
public static void main(String[] args)
{
HelloClass hd = new HelloClass();
hd.run();
}
}
Я знаю правильный путь для достижения этой цели с помощью объявить аргумент newInstance как класса <T>, но будет как понять, почему это невозможно сделать, как выше.
UPD: Вот исключение я получаю:
java.lang.InstantiationException: HelloClass$MyClass
at java.lang.Class.newInstance0(Class.java:340)
at java.lang.Class.newInstance(Class.java:308)
at HelloClass.newInstance(HelloClass.java:14)
at HelloClass.run(HelloClass.java:24)
at HelloClass.main(HelloClass.java:30)
Какой класс вы пытаетесь создать экземпляр? Если это абстрактный класс или интерфейс, то это не сработает, и вы получите исключение InstantiationException. Может быть, в том числе и трассировка стека исключения поможет. – JasCav
Я пытаюсь создать экземпляр MyClass, подумал, что это совершенно очевидно, поскольку я вызываю newInstance (m), где m является экземпляром MyClass;). Добавлено исключение из исходного сообщения. – azerole
Почему упоминание дженериков в названии? Что они должны делать с этой проблемой? – skaffman