Java 使用泛型类型的方法

Java 使用泛型类型的方法,java,generics,inheritance,Java,Generics,Inheritance,我目前正在为一个供应链项目编写一个XML转换器。我们使用请求和命令 转换器有多个方法,当前执行相同的操作,但分别为请求和订单实现 因此,我创建了一个抽象类来提高代码的可维护性,并使用了泛型类型: public abstract class AbstractConverter<T extends BusinessObject> 我现在的问题是:这是一种方法,还是有一种更优雅的方法在这种情况下使用泛型 我需要解决这个问题,但我也想使用好的风格 我建议将getRemark方法提取到一个接

我目前正在为一个供应链项目编写一个XML转换器。我们使用请求和命令

转换器有多个方法,当前执行相同的操作,但分别为请求和订单实现

因此,我创建了一个抽象类来提高代码的可维护性,并使用了泛型类型:

public abstract class AbstractConverter<T extends BusinessObject>
我现在的问题是:这是一种方法,还是有一种更优雅的方法在这种情况下使用泛型


我需要解决这个问题,但我也想使用好的风格

我建议将
getRemark
方法提取到一个接口,该接口由
Request
Order
实现

这样,您就可以简单地检查传入的泛型对象是否是接口的实例

protected Comment createComment(T obj) {
    if (obj instanceof Remarkable) {
        return new Comment(((Remarkable) obj).getRemark());
    }
    throw new IllegalArgumentException("This method does not support objects of the type " + obj.getClass().toString());
}

我建议将
getRemark
方法提取到一个接口,该接口由
Request
Order
实现

这样,您就可以简单地检查传入的泛型对象是否是接口的实例

protected Comment createComment(T obj) {
    if (obj instanceof Remarkable) {
        return new Comment(((Remarkable) obj).getRemark());
    }
    throw new IllegalArgumentException("This method does not support objects of the type " + obj.getClass().toString());
}

自然的面向对象解决方案是使
createComment
成为一种抽象方法

protected abstract Comment createComment(T obj);
并让子类实现它:

public class OrderConverter extends AbstractConverter<Order> {
     protected Comment createComment(Order order) {
           return new Comment(order.getRemark());
     }
}

public class RequestConverter extends AbstractConverter<Request> {
     protected Comment createComment(Request request) {
           return new Comment(request.getRequestRemark());
     }
}
公共类OrderConverter扩展了AbstractConverter{ 受保护的注释createComment(顺序){ 返回新注释(order.getRemark()); } } 公共类RequestConverter扩展了AbstractConverter{ 受保护的注释createComment(请求){ 返回新注释(request.getRequestRemark()); } }
自然的面向对象解决方案是将
createComment
作为一种抽象方法

protected abstract Comment createComment(T obj);
并让子类实现它:

public class OrderConverter extends AbstractConverter<Order> {
     protected Comment createComment(Order order) {
           return new Comment(order.getRemark());
     }
}

public class RequestConverter extends AbstractConverter<Request> {
     protected Comment createComment(Request request) {
           return new Comment(request.getRequestRemark());
     }
}
公共类OrderConverter扩展了AbstractConverter{ 受保护的注释createComment(顺序){ 返回新注释(order.getRemark()); } } 公共类RequestConverter扩展了AbstractConverter{ 受保护的注释createComment(请求){ 返回新注释(request.getRequestRemark()); } }
。。。如果可以让
BusinessObject
同时实现
卓越的
接口,您甚至可以跳过
实例的
。@DaDaDom那么拥有接口是没有用的。如果所有
BusinessObject
都可以返回备注,只需在该类中使用抽象方法即可。感谢您的输入。不幸的是,我不能这样做,因为我不能更改顺序和请求类,因为这将意味着对现有代码进行大量重构,因为我有几十个方法,目前已经实现了两次,如果代码基本上没有实现,我不认为有两个单独的实现有什么意义same@Fish-听起来像是糟糕的编码。你甚至承认想要更优雅的代码。我将提取所有“几乎”复制到接口中的方法,或者如果适用,直接提取到抽象类中。它极大地提高了对象的可读性和可用性。。。。如果可以让
BusinessObject
同时实现
卓越的
接口,您甚至可以跳过
实例的
。@DaDaDom那么拥有接口是没有用的。如果所有
BusinessObject
都可以返回备注,只需在该类中使用抽象方法即可。感谢您的输入。不幸的是,我不能这样做,因为我不能更改顺序和请求类,因为这将意味着对现有代码进行大量重构,因为我有几十个方法,目前已经实现了两次,如果代码基本上没有实现,我不认为有两个单独的实现有什么意义same@Fish-听起来像是糟糕的编码。你甚至承认想要更优雅的代码。我将提取所有“几乎”复制到接口中的方法,或者如果适用,直接提取到抽象类中。它极大地提高了对象的可读性和可用性。“基本上”是什么意思?没有“一点点怀孕”。它们是相同的,然后将它们拉入抽象类,或者它们不是,然后分别实现它们(参见wero的答案)。通过引入if/else/instanceof blocks来增加复杂性和不可维护性,这确实是个坏主意。“基本上”是什么意思?没有“一点点怀孕”。它们是相同的,然后将它们拉入抽象类,或者它们不是,然后分别实现它们(参见wero的答案)。通过引入if/else/instanceof块来增加复杂性和不可维护性,这确实是个坏主意。