2013-02-14 2 views
2

У меня есть этот интерфейс,Используя абстрактный класс, который реализует интерфейс (Java)

public interface IAnything { 
    void m1(); 
    void m3(); 
} 

И два абстрактных классов, реализующих этот интерфейс:

public abstract class AbstractThing1 implements IAnything { 
    public void m1() {} 
    public void m3() {} 
} 

public abstract class AbstractThing2 implements IAnything { 
    public void m1() {} 
    public void m3() {} 
} 

Где-то в моем коде я хочу, чтобы вызвать function doSomething(kindOfAbstractClass) что выполняет m1() и m3(), среди других заданий в зависимости от видаOfAbstractClass.

Как определить и позвонить doSomething()? Я сделал это, но он не работает. Благодаря

private <T extends IAnything> void doSomething(T kindOfAbstractClass) { 
... 
kindOfAbstractClass.m1(); 
kindOfAbstractClass.m3(); 
... 
} 

doSomething(AbstractThing1.class); 
+2

Неверный запрос 'doSomething'. Не передавайте «Класс», а экземпляр одного из ваших 2 классов. –

+0

Но это эти классы абстрактные, у меня нет никаких экземпляров. – Arturo

+1

Да, читайте @gheese ответ, вам нужен экземпляр, чтобы использовать 'doSomething'. Я предполагал, что у вас есть один в какой-то момент вашего кода. –

ответ

4

Ваша проблема заключается в том, что вы поставляют тип класса, а не экземпляра в качестве параметра DoSomething

Посмотрите на измененный код ниже:

public class MyClass { 


    void doIt(){ 
     doSomething(new ConcreteThing());  
    } 

    private <T extends IAnything> void doSomething(T kindOfAbstractClass) { 

      kindOfAbstractClass.m1(); 
      kindOfAbstractClass.m3(); 
    } 

} 


interface IAnything { 
     void m1(); 
     void m3(); 
} 

abstract class AbstractThing1 implements IAnything { 
     public void m1() {} 
     public void m3() {} 
} 


class ConcreteThing extends AbstractThing1{ 

} 
3

Попробуйте это:

private void doSomething(IAnything kindOfAbstractClass) { 
... 
kindOfAbstractClass.m1(); 
kindOfAbstractClass.m3(); 
... 
} 
+0

Спасибо. Но как я это называю? йоЗотеЬЫпд (AbstractThing1.class); Там я получаю ошибки. – Arturo

+1

Вы должны передать экземпляр методу doSomething, но абстрактный класс не может быть создан напрямую, поэтому вам нужно расширить абстрактный класс, чтобы реализовать его абстрактные методы, а затем передать doSomething экземпляр созданного нового класса. – Cisco

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