รับชื่อประเภททั่วไป ณ เวลารวบรวมสำหรับคำอธิบายประกอบ [ซ้ำ]

พิจารณาคลาสทั่วไปนี้:

public class ListHolder<T> {
  private List<T> objects;
  [...] // non relevant fields
}

ฉันใช้ Gson เพื่อดีซีเรียลไลซ์การตอบสนอง JSON จาก REST api รายการออบเจ็กต์ทั้งหมดใน API มีลักษณะดังนี้:

{"clients":[{"id":6493557,"name":"test", [..]}, {"id":6493557, 
[..]}]}

{"users":[{"id":6493557,"name":"test", [..]}, {"id":6493557, 
[..]}]}

ปัญหาคือแม้ว่าโครงสร้างของการตอบกลับจะเหมือนกัน แต่คำสำคัญที่เริ่มต้นรายการจะมีชื่อของออบเจ็กต์โดเมน Gson ใช้ชื่อของฟิลด์เป็นคำหลักหรือคำอธิบายประกอบ @SerializedName ที่เป็นตัวเลือก แต่ฉันไม่รู้ว่าจะรับชื่อ T ได้อย่างไรในเวลารวบรวม

ฉันรู้ว่าเป็นไปไม่ได้ที่จะรับมันที่รันไทม์เนื่องจากการลบประเภท แต่คำอธิบายประกอบจำเป็นต้องมีค่าคงที่เวลาคอมไพล์อยู่แล้ว และคอมไพเลอร์ก็มีข้อมูลนี้ในเวลาคอมไพล์

ฉันต้องการใช้ ListHolder<Client> และ ListHolder<User> ซึ่งจะได้ผลหากฉันสามารถทำได้:

public class ListHolder<T> {
  @SerializedName(nameof(T).toLowerCase() + "s")
  private List<T> objects;
  [...] // non relevant fields
}

nameof() มีอยู่จริงหรือไม่? มีวิธีอื่นในการแก้ปัญหานี้หรือไม่? ฉันอาจจะแก้ปัญหานี้ได้ด้วย TypeAdapters และโดยการปรับแต่งการดีซีเรียลไลซ์ แต่ฉันรู้สึกว่ามันจะไม่ดีนัก


person Marco Nembrini    schedule 14.02.2018    source แหล่งที่มา