【问题标题】:Java interfaces - parametric polymorphismJava接口——参数多态
【发布时间】:2011-01-21 14:41:59
【问题描述】:

在 Java 中,在方法的参数需要参数多态的情况下,实现接口的“正确”方式是什么?

比如我的界面包含:

public int addItem(Object dto);

接口由各种类实现,但每个类中的 dto 参数都是各种强类型对象之一,例如 planeDTO、trainDTO 或 autoDTO。

例如在我的planeDAO类中:

public int addItem(planeDTO dto) { ... }

我是否只需将 dto 参数作为 Object 实现,然后转换为适当的类型?

【问题讨论】:

    标签: java interface polymorphism


    【解决方案1】:

    如果 DTO 都继承自一个公共超类或实现一个公共接口,您可以这样做:

    // DTO is the common superclass/subclass
    public interface Addable<E extends DTO> {
    
        public int addItem(E dto);
    
    }
    

    而你的具体实现可以做到:

    public class PlaneImpl implements Addable<planeDTO> {
        public int addItem(planeDTO dto) { ... }
    }
    

    或者,你可以简单地定义你的接口来接受接口/超类:

    // DTO is the common superclass/subclass
    public interface Addable {
    
        public int addItem(DTO dto);
    
    }
    

    编辑:

    您可能需要做以下事情:

    创建界面-

    interface AddDto<E> {
        public int addItem(E dto);
    }
    

    并在你的 DAO 中实现它。

    class planeDAO implements AddDto<planeDTO> {
        public int addItem(planeDTO dto) { ... }
    }
    

    【讨论】:

    • DTO 之间没有任何共同点,因此我想在接口中使用 Object,但我仍然希望在实现中进行类型检查。
    • @Bob,如果这些对象没有通用类型,那么为了验证类型,我认为您需要为每个 dto 类型使用不同的类。如果你能给 dto 提供一个接口和一些常用的方法,那将是非常有益的。
    • 谢谢贾斯汀。我不确定你的意思是“每个 dto 类型的不同类”,除非你的意思是每个 dto 和 dao 组合的不同接口?每个 DTO 都包含非常不同的信息,我想坚持使用 DAO 来实现实际功能,因此我不打算向 DTO 添加任何方法。我想底线是我没有错过明显的东西,除非我从完全不同的角度来看待事情,否则我想要的东西是不可能的?
    • @Bob,为了使用您在问题中指定的多态性,是的,您需要从一个非常不同的角度来解决这个问题。多态性仅在您具有类型层次结构时才有效。如果您要坚持使用不遵循特定接口或继承某些通用超类的对象,您将需要完全不同的东西。
    • 再次感谢,我真的很感谢您的反馈。我已经玩了很多次,即使我的 DTO 要从超类继承,我仍然无法在接口中键入参数作为超类,也无法在每个实现中键入与该超类的子类相同的参数,我想它会起作用,但它不会。毕竟,这就是我正在做的事情,除了我的 DTO 的超类是 Object。我欢迎您有任何进一步的想法。
    【解决方案2】:

    为什么不使用提供您需要的功能而不引用具体类型的接口?

    public int addItem(ITransportationMode mode);
    

    其中planeDTOtrainDTOautomobileDTO 都实现ITransportationMode

    【讨论】:

    • 谢谢亚伦。 DTO 没有任何共同点(为了简单起见,我选择它们作为示例),因此 ITransportationMode 实际上是空的,并且在实现中我不会进行类型检查(假设我在我的实现中也输入为 ITransportationMode)。跨度>
    【解决方案3】:

    您是否想联系double dispatch 之类的东西?取决于参数类型的行为是什么?

    【讨论】:

    • 我猜这类似于双重调度。每个 DTO 在各自的 DAO addItem 实现中都有自己的 SQL 插入。
    【解决方案4】:

    你也可以使用泛型方法:

    public interface Addable{
       public <T extends DTO> int addItem(T dto){}
    }
    

    您可以阅读更多关于泛型方法的信息:http://download.oracle.com/javase/tutorial/extra/generics/methods.html

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2015-01-23
      • 2016-09-09
      • 1970-01-01
      • 1970-01-01
      • 2012-12-23
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多