簡體   English   中英

Java默認方法 - 獲取子類的類型

[英]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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM