Из ответа в этом моем предыдущем вопросе: как наилучшим образом создать экземпляр из объекта класса
Я пытаюсь сделать то, что он предлагает, но я не знаю, как исправить ошибку.
Код:
import java.lang.reflect.*;
class Foo {
public <T> T create(float x, float y, Class<T> myClass)
throws Exception {
Constructor<T> toCall = myClass.getConstructor(float.class, float.class);
return toCall.newInstance(x, y);
}
}
class Dog {
public Dog(float x, float y) {
print(x);
print(y);
}
}
Foo foo = new Foo();
try {
foo.create(10.0f, 10.0f, Dog.class);
} catch (Exception e) {
print(e);
}
Исключение:
java.lang.NoSuchMethodException: sketch_140319d$1Dog.<init>(float, float)
Поскольку я только что прокомментировал ваш другой вопрос, это не сработает, если Dog
- нестатический внутренний класс sketch_140319
, который предлагает сообщение об ошибке. Думаю, вы лишили класс sketch_140319
из своего вопроса - я не знаю, почему вы это сделали, когда это была проблема.
Вам нужно либо сделать Dog
static, либо добавить sketch_140319.class
в качестве первого аргумента getConstructor
и экземпляр sketch_140319
в качестве первого аргумента newInstance
.
вы не можете позвонить
foo.create(10.0, 10.0, Dog.class);
потому что 10.0 - это двойной, а не плавающий
называть его как float, do
foo.create(10.0f, 10.0f, Dog.class);
Обновление: мой код
class Dog {
public Dog(float x, float y) {
print(x);
print(y);
}
private void print(float x) {
System.out.println(x);
}
}
а также
import java.lang.reflect.Constructor;
class Foo {
public <T> T create(float x, float y, Class<T> myClass)
throws Exception {
Constructor<T> toCall = myClass.getConstructor(float.class, float.class);
return toCall.newInstance(x, y);
}
}
а также
public class SomeOtherClass {
/**
* @param args
*/
public static void main(String[] args) {
Foo foo = new Foo();
try {
foo.create(10.0f, 10.0f, Dog.class);
} catch (Exception e) {
e.printStackTrace();
}
}
}
и он вернулся
10.0
10.0