2013-03-16 98 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方法应该是什么。