java - 如何使用泛型将这两种方法合二为一?

标签 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;
    }

最佳答案

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

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

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

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

关于java - 如何使用泛型将这两种方法合二为一?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/33977182/

相关文章:

java - 确定字节数组的实际内容

java - Red5 - 从应用程序服务器独立调用客户端方法

Swift - 当可相等时比较泛型

java - 如何使用 Guice 使 Multibinder 与 FactoryModuleBuilder 和泛型一起工作?

c# - 在 f# : can't get the type right 中实现 C# 接口(interface)

c# - Unity - 使用接口(interface)参数注册通用类型

c# - 在 STRtree 中找到最近的位置

java - 从 java 中的函数返回 double 和 int 值

java - Java 中的“获取”REST 调用 : when does it actually execute?

c# - 在 C# 中转换为泛型类型