2013-03-16 120 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怎麼辦? – 2013-03-16 22:47:15

+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。編譯器無法確定實際實例將具有運行時類型Packet1Packet2,因此它不知道getsend方法應該是什麼。