2013-11-18 6 views
1

В следующем, что я хочу, чтобы это произошло, что w.someMethod() возвращает экземпляр SomeSubClass. К сожалению, это не сработает. Я считаю, что код объяснит это лучше, чем я могу.Динамическое создание экземпляра класса

public abstract class SomeSuperClass { 
    public SomeSuperClass(int x) { 
     // do nothing 
    } 
    public SomeSuperClass someMethod() { 
     //this line 
     return (new Class()).getDeclaredConstructor(getClass()).newInstance(1)); 
     //this line 
    } 
} 

public class SomeSubClass extends SomeSuperCLass { 
    public SomeSubClass(int x) { 
     super(x); 
    } 
} 

public static void main(String[] args) { 
    SomeSubClass w = new SomeSubClass(3); 
    SomeSubClass q = w.someMethod(); 
} 

Вот мое возвращение

SomeSuperClass.java:7: error: Class() has private access in Class 
    return (new Class()).getDeclaredConstructor(getClass()).newInstance(1); 
      ^
SomeSuperClass.java:7: error: incompatible types 
    return (new Class()).getDeclaredConstructor(getClass()).newInstance(1); 
                    ^
required: SomeSuperClass 
found: Object 
Main.java:4: error: incompatible types 
    SomeSubClass q = w.someMethod(); 

Для дальнейшего уточнения, следующий код будет делать то, что я хочу:

public abstract class SomeSuperClass { 
    public SomeSuperClass(int x) { 
     // do nothing 
    } 
    public abstract SomeSuperClass someMethod(); 
} 

public class SomeSubClass extends SomeSuperCLass { 
    public SomeSubClass(int x) { 
     super(x); 
    } 
    public SomeSuperClass someMethod() { 
     return new SomeSubClass(1); 
    } 
} 

public static void main(String[] args) { 
    SomeSubClass w = new SomeSubClass(3); 
    SomeSubClass q = w.someMethod(); 
} 

Но я хотел бы, чтобы SomeMethod быть в класс SomeSuperClass

+0

Какие проблемы/ошибки вы сталкиваетесь? Если вы сталкиваетесь с сообщениями об ошибках компилятора или любыми исключениями из стека, отправьте их здесь с вашим вопросом. Если вы столкнулись с проблемами поведения программы, опишите их. –

+0

В частности, здесь я получаю, что Class() имеет частный доступ. Если вместо этого я делаю вызов как Class.getDeclardedConstructor (...) ..., то я делаю статический вызов из нестатического контекста. – graviton

ответ

2

Переопределение someMEthod() в вашем дочернем классе?

public class SomeSubClass extends SomeSuperCLass { 
    public SomeSubClass(int x) { 
     super(x); 
    } 
    public SomeSuperClass someMethod(){ 
     return new SomeSubClass(1); 
    } 
} 
+0

Я мог бы это сделать, но если бы у меня было много классов, которые расширяют ** SomeSuperClass *, я бы хотел избежать переопределения ** someMethod() ** в каждом подклассе. – graviton

3

new Class не является надлежащим способом получения объекта класса. Вместо того, чтобы надлежащим образом является использование метода getClass()

return getClass().getDeclaredConstructor(int.class).newInstance(1); 

Но вам не нужно использовать отражение для создания объекта, как тот, у вас уже есть. Вместо этого вы можете переопределить метод someMethod, как вам подскажет JoeC.

+0

Это именно то, что я искал. – graviton

2

Если то, что вы хотите для этого метода, чтобы вернуть новый экземпляр независимо от класса он вызывается, используя конструктор, который принимает int, то вы должны сделать:

return getClass().getDeclaredConstructor(int.class).newInstance(1); 

Но это не понятно, почему вы бы не просто переопределили метод, чтобы явно создать экземпляр подкласса в каждом подклассе, как предлагает JoeC.

+0

Спасибо, вы и Кирилл Ка обеспечили именно то, что я искал. – graviton

Смежные вопросы