2013-03-16 2 views
0

Мой источник:Где находится метод?

private static HashMap<String, Class<?>> mapLogic = new HashMap<String,Class<?>>(); 

mapLogic.put("s", Packet1.class); 
mapLogic.put("a", Packet2.class); 

public abstract class Packet { 
    public abstract void get(ChannelBuffer buffer); 
    public abstract void send(ChannelBuffer buffer); 
} 

и

public class Packet1 extends Packet{ 

    @Override 
    public void get(ChannelBuffer buffer) { 
    } 


    @Override 
    public void send(ChannelBuffer buffer) { 
    } 

} 


public class Packet2 extends Packet{ 

    @Override 
    public void get(ChannelBuffer buffer) { 
    } 

    @Override 
    public void send(ChannelBuffer buffer) { 
    } 

} 

mapLogic.get("s").newInstance().get() < --- получить или отправить не доступно

Как я могу получить эти методы?

+0

Необходимо указать параметр. – 2013-03-16 22:45:12

+0

@Legend, как это сделать? –

+2

Попробуйте 'mapLogic.get (« s »). NewInstance(). Get (null);' – 2013-03-16 22:48:26

ответ

3

Изменить это:

private static HashMap<String, Class<?>> mapLogic = new HashMap<String,Class<?>>(); 

к этому:

private static HashMap<String, Class<? extends Packet>> mapLogic = 
    new HashMap<String, Class<? extends Packet>>(); 

так что выражение mapLogic.get("s") будет иметь тип Class<? extends Packet>, и выражение mapLogic.get("s").newInstance() будет иметь тип Packet.

, как вы есть сейчас, выражение mapLogic.get("s") имеет тип Class<?>, и выражение mapLogic.get("s").newInstance() имеет тип Object. Компилятор не может сказать, что фактический экземпляр будет иметь тип времени исполнения Packet1 или Packet2, поэтому он не знает, какие должны быть методы и send.

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