鍍金池/ 問答/Java  C++/ 關(guān)于Java的方法的參數(shù)問題

關(guān)于Java的方法的參數(shù)問題

在一個Java類內(nèi)定義了一個接口,然后將接口作為本類的一個方法的參數(shù),當(dāng)調(diào)用這個方法時,本應(yīng)傳入接口的位置傳入了本類的另一個方法(這個方法和接口中的唯一方法的參數(shù)類型對應(yīng))。程序如下所示。我很不清楚這樣使用的原理,接口和方法完全是兩個東西,在調(diào)用的過程中發(fā)生了什么轉(zhuǎn)換實現(xiàn)了這種方式?希望哪位大神指點一下,感謝。

包含接口的類(其中定義了函數(shù)式接口、和參數(shù)為接口的方法、以及調(diào)用時傳入的方法):

public class ClientMessage {
    private static final Logger logger = LoggerFactory.getLogger(ClientMessage.class);

    public static HashMap<Integer, Transfer> tranferHandlerMap = new HashMap<>();
    public static HashMap<Class<?>, Integer> msg2ptoNum = new HashMap<>();

    @FunctionalInterface
    public interface Transfer{
        void process(Message msg, ClientConnection conn) throws IOException;
    }

    public static void registerTransferHandler(Integer ptoNum, Transfer tranfer, Class<?> cla) {
        if (tranferHandlerMap.get(ptoNum) == null)
            tranferHandlerMap.put(ptoNum, tranfer);
        else {
            logger.error("pto has been registered in transeerHandlerMap, ptoNum: {}", ptoNum);
            return;
        }

        if(msg2ptoNum.get(cla) == null)
            msg2ptoNum.put(cla, ptoNum);
        else {
            logger.error("pto has been registered in msg2ptoNum, ptoNum: {}", ptoNum);
            return;
        }
    }

    public static void processTransferHandler(Message msg, ClientConnection conn) throws IOException {
        logger.info("MessageName {}", msg.getClass());
        int ptoNum = msg2ptoNum.get(msg.getClass());
        Transfer transferHandler = tranferHandlerMap.get(ptoNum);

        if(transferHandler != null) {
            transferHandler.process(msg, conn);
        }
    }

    public static void transfer2Logic(Message msg, ClientConnection conn) {
        ByteBuf byteBuf = null;
        if(conn.getUserId() == null ) {
            logger.error("User not login.");
            return;
        }

        if(msg instanceof Chat.CPrivateChat) {
            byteBuf = Utils.pack2Server(msg, ParseMap.getPtoNum(msg), conn.getNetId(), Internal.Dest.Logic, conn.getUserId());
        }

        GateLogicConnectionHandler.getGatelogicConnection().writeAndFlush(byteBuf);
    }

    public static void transfer2Auth(Message msg, ClientConnection conn) {
        ByteBuf byteBuf = null;
        if(msg instanceof Auth.CLogin) {
            String userId = ((Auth.CLogin) msg).getUserid();
            byteBuf = Utils.pack2Server(msg, ParseMap.getPtoNum(msg), conn.getNetId(), Internal.Dest.Auth, userId);
            ClientConnectionMap.registerUserid(userId, conn.getNetId());
        } else if(msg instanceof Auth.CRegister) {
            byteBuf = Utils.pack2Server(msg, ParseMap.getPtoNum(msg), conn.getNetId(), Internal.Dest.Auth, ((Auth.CRegister) msg).getUserid());
        }

        GateAuthConnectionHandler.getGateAuthConnection().writeAndFlush(byteBuf);

    }
}

調(diào)用方法時的代碼:

ClientMessage.registerTransferHandler(1000, ClientMessage::transfer2Auth, Auth.CLogin.class);
ClientMessage.registerTransferHandler(1001, ClientMessage::transfer2Auth, Auth.CRegister.class);
ClientMessage.registerTransferHandler(1003, ClientMessage::transfer2Logic, Chat.CPrivateChat.class);
ClientMessage.processTransferHandler(message, conn);
回答
編輯回答
憶往昔

可以看看這個java8的系列教程 : https://github.com/itguang/java8

2017年10月12日 14:25
編輯回答
影魅

這個設(shè)計到 Java 8 的方法引用以及 Lambda 表達(dá)式。你可以查查相關(guān)的資料,不是一句半句可以說清楚的,如果有興趣可以報名我的講座 https://segmentfault.com/l/15...

2018年6月29日 02:33