如何使用泛型将这两种方法合并为一个?

时间:2015-11-28 22:31:36

标签: java generics

我知道很多像这样的Java泛型问题已经存在,例如(How to refactor two Java methods into one?),但我想我只需要用我自己的,更简单的函数来看它 - 以一个如何调用它的例子,要完全理解java泛型......我道歉并提前感谢你!

我所知道的是,我可能需要使用instanceof和Class.forName来处理不同的返回类型(并且可能为desiredClass添加第二个参数,或者可以在不添加第二个参数的情况下以某种方式推导出来?)

public static <T> T getSanitizedURI(String theUrl, Class desiredReturnType) {
}

但接着是什么?

public static URI getSanitizedURI(String theUrl) {
        URI sanitizedUri = null;
        try{
            URL url = new URL(theUrl);
            sanitizedUri = new URI(url.getProtocol(), url.getUserInfo(), url.getHost(), url.getPort(), url.getPath(), url.getQuery(), url.getRef());
        } catch(Exception e) {
            e.printStackTrace();
        }
        return sanitizedUri;
    }

    public static String getSanitizedURIString(String theUrl) {
        String sanitizedUrl = theUrl;
        try{
            URL url = new URL(theUrl);
            URI uri = new URI(url.getProtocol(), url.getUserInfo(), url.getHost(), url.getPort(), url.getPath(), url.getQuery(), url.getRef());
            sanitizedUrl = uri.toASCIIString();
        } catch(Exception e) {
            e.printStackTrace();
        }
        return sanitizedUrl;
    }

1 个答案:

答案 0 :(得分:1)

在我看来,这不是一个很好的泛型用例。如果用户想要String,他们可以使用返回String的方法。如果他们想要URI,他们可以使用返回URI的方法。如果在编写方法时无法确定该方法可以用于的所有不同类型,或者该方法是否用于许多不同类型,则泛型将更合适。

但是,您可以按如下方式减少代码重复

public static String getSanitizedURIString(String theUrl) {
    return getSanitizedURI(theUrl).toASCIIString();
}

请注意,如果NullPointerException返回getSanitizedURI,则会抛出null。您可能更喜欢以不同方式处理此情况,例如按照@ViacheslavVedenin的建议返回theUrl