使用泛型类型的方法

时间:2016-05-25 08:47:23

标签: java generics inheritance

我目前正在为供应链项目编写XML转换器。我们使用请求和订单。

转换器有多种方法,目前相同,但是分别为请求和订单实现。

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

public abstract class AbstractConverter<T extends BusinessObject>

然后我有实际转换器的具体实现

public class OrderConverter extends AbstractConverter<Order>
public class RequestConverter extends AbstractConverter<Request>

正如我所说,我在两个特定的类中有几个基本相同的方法,所以我自然希望它们在抽象类中。我现在已经向抽象类添加了以下方法:

protected Comment createComment(T obj) {
    String remark;
    if (obj instanceof Order) {
        remark = ((Order) obj).getRemark();
    } else if (obj instanceof Request) {
        remark = ((Request) obj).getRequestRemark();
    } else {
        throw new IllegalArgumentException("This method does not support objects of the type " + obj.getClass().toString());
    }
    return new Comment(remark);
}

我现在的问题是:这是要走的路还是在这种情况下有更优雅的方式来使用泛型?

我需要解决此问题,但我也希望使用好的风格。

2 个答案:

答案 0 :(得分:3)

面向自然对象的解决方案是使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());
     }
}

答案 1 :(得分:2)

我建议将getRemark方法解压缩到RequestOrder都实现的接口。

这样您就可以简单地检查传入的通用对象是否是接口的实例。

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());
}