4

我有一个接口,我想在其中提供一个默认方法来序列化继承的类。我使用一个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 方法。这可能吗?

4

3 回答 3

3

我相信您可能正在寻找的是这样的接口声明:

public interface A<T extends A<T>>
{
    public default String write()
    {
        new JsonSerializer<T>();
    }
}

public class AX implements A<AX>
{
}

当您需要将当前类作为泛型参数引用时,使用自边界泛型有时很有用。例如,这也由 javaEnum类完成:abstract class Enum<E extends Enum<E>>.

于 2014-04-02T06:31:20.620 回答
1

在接口中使用泛型

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> {
}
于 2014-04-02T06:12:40.860 回答
1

泛型机制中的类型参数只是编译时信息。此类型信息在字节码中被擦除。

对象的确切类类型(您可以使用 检索getClass())是运行时信息。

结论:由于您只能将静态类型名称放在泛型括号内,因此无法在其中进行任何运行时调用。

使您的序列化程序有点协变的唯一方法是编写

new JsonSerializer<? extends A>() ...

但真正的问题应该是:你想达到什么目标?我觉得,您的方法并不能解决您的问题。

于 2014-04-02T06:09:50.933 回答