【问题标题】:Java Default Method - get type of subclassJava 默认方法 - 获取子类的类型
【发布时间】:2014-05-13 04:39:35
【问题描述】:

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

【问题讨论】:

    标签: java generics default-method


    【解决方案1】:

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

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

    当您需要将当前类作为通用参数引用时,使用Self-bounding generics 有时很有用。这是例如也由 java Enum 类完成:abstract class Enum&lt;E extends Enum&lt;E&gt;&gt;

    【讨论】:

      【解决方案2】:

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

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

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

      让你的序列化器有点协变的唯一方法是编写

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

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

      【讨论】:

      • 嘿,我要实现的目标在这里解释得相当多……这也是我使用这种方法的方法,现在它似乎工作正常。谢谢。
      • 泛型类型严格编译时的信息很普遍,但并不完全正确。看到这个答案:stackoverflow.com/a/2801291/178526
      【解决方案3】:

      在接口中使用泛型

      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> {
      }
      

      【讨论】:

      • 嗯.. 这是一个聪明的方法!谢谢。
      猜你喜欢
      • 1970-01-01
      • 2023-03-09
      • 2022-10-13
      • 2011-10-01
      • 1970-01-01
      • 2011-02-22
      • 1970-01-01
      • 1970-01-01
      • 2019-08-26
      相关资源
      最近更新 更多