[英]Java Default Method - get type of subclass
我有一個接口,我想在其中提供一個默認方法來序列化繼承的類。 我使用JsonSerializer<T>
類來進行序列化。
該方法如下:
public interface A
{
public default String write()
{
new JsonSerializer</*Inherited class type*/>();
// I've tried new JsonSerializer<this.getClass()>(); - Doesn't work
}
}
public class AX implements A
{
}
因此,當我實例化AX時,我想使用write方法來序列化AX
AX inst = new AX();
String instSerialized = inst.write();
我需要將AX的類型傳遞給A中的write方法。這可能嗎?
我相信你可能正在尋找的是這樣的接口聲明:
public interface A<T extends A<T>>
{
public default String write()
{
new JsonSerializer<T>();
}
}
public class AX implements A<AX>
{
}
當您需要將當前類作為泛型參數引用時,使用自定義泛型有時很有用。 這也是由例如java Enum
類完成的: abstract class Enum<E extends Enum<E>>
。
泛型機制中的類型參數僅是編譯時信息。 該類型信息在字節碼中被擦除。
對象的確切類類型(可以使用getClass()
檢索)是運行時信息。
結論:由於您只能將靜態類型名稱放在泛型括號中,因此無法在那里進行任何運行時調用。
使序列化程序有點協變的唯一方法是編寫
new JsonSerializer<? extends A>() ...
但真正的問題應該是:你想要實現什么? 我覺得,你的方法並不能解決你的問題。
在界面中使用泛型
public interface A<T> {
public default String write() {
new JsonSerializer<T>();
// I've tried new JsonSerializer<this.getClass()>(); - Doesn't work
}
}
public class AX implements A<AX> {
}
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.