2017-07-15 51 views
0

我正在使用谷歌的protobuf庫爲您自動生成代碼。所以,如果你有一個PersonRequest爲您Person對象,它會爲你生成代碼,看起來像泛型,反射,獲取自動生成的代碼

PersonRequest.parseFrom(byte[] bytes) 

所以我的每個請求的,我有一個看起來有些類似的代碼

XXXXXRequest.paseFrom(byte[] bytes) 

我想要做的就是寫這樣

public interface MyInterface<T> { 
    T parseFrom(byte[] bytes) 
} 

再經過一個接口,我真的不知道該怎麼在執行做。它是否去像

public class MyInterfaceImpl<T> implements MyInterface<T> { 
    @Override 
    T parseFrom(byte[] bytes) { 
     return T.parseFrom(bytes); // what do I do here? 
    } 
} 

我不知道是否有可能獲得通過反射對象的方法,或者我應該在這裏做什麼?

+0

是什麼'PersonRequest.parseFrom(字節[]字節)'返回? – davidxxx

+0

@davidxxx它返回一個PersonRequest。它基本上從原始字節構造它。 – Crystal

+0

你有沒有在圖書館尋找內置的方式來做你想做的事情,而不是太依賴於思考? –

回答

0

而是爲您創造獨立網絡接口的實現,你可以直接引用解析器方法,並用它來創建接口的實例:

MyInterface<PersonRequest> obj = PersonRequest::parseFrom; 
0

每個生成的類(PersonRequest,OtherClassRequest等。 ..)將是一個特定的類。
所以,你應該通過特定的生成類來定義一個實現。

在這些情況下,宣稱無論是接口和子類仿製藥不需要:

public class MyInterfaceImpl<T> implements MyInterface<T> { 

你只需要爲MyInterface接口通用。
你聲明的方式沒問題。

然後,它的子類應該指定它們實現的父類的通用類型。

例如:

public class MyPersonRequestImpl implements MyInterface<PersonRequest> { 
    @Override 
    PersonRequest parseFrom(byte[] bytes) { 
     return PersonRequest.parseFrom(bytes); 
    } 
} 
+0

我想使用反射的原因基本上每個類對於每種消息類型都是這樣的。所有生成的代碼都有PersonRequest.parseFrom(bytes)或OtherRequest.parseFrom(bytes),我試圖看看是否有辦法讓一個類來做,而不是創建多個類,因爲我的消息類型基本上包裝了自動生成的代碼。 – Crystal