Java:具有许多返回类型的一个函数......泛型是否可能?

时间:2010-08-23 23:46:18

标签: java generics

我有一些程序,为简单起见,看起来如下:

public String fetchValueAsString(String key);
public DateTime fetchValueAsDateTime(String key);

我想要像

这样的东西
public <X is a String or a DateTime> X fetchValue(String key);  // pseudo-code

我可以像这样调用(没有强制转换;传递的参数隐含了类型):

String str = fetchValue("subject");
DateTime dt = fetchValue("startDate");

我知道我可以只有一个方法返回Object类型并只进行转换,但我想知道是否有一种方法可以只调用一个方法,并以某种方式使用泛型来确定返回值。那么,它可以用Java(it is in C#)吗?

2 个答案:

答案 0 :(得分:4)

当然,但只有传递参数隐含数据类型时才会起作用。

我可以声明以下内容并且不会收到任何错误:

public static <T> T parseString(String s) {
    return (T) new Date();
}

public static void test() {
    Date dt = parseString("date");
}

但是这种事情的结果是你的解析函数的内部必须能够查看字符串并确定目标类型,并且必须在其体内进行大量的转换。工作正常。

你的问题是否有点模棱两可,这是否是你想要的东西,或者你真正想要的是让接收者的类型决定被调用的方法或方法内的行为。这是,AFAIK不可能。一旦你进入方法,你必须使用的就是字符串。

答案 1 :(得分:1)

由于类型擦除,在Java中,必须明确传递返回类型:

public <X> X fetchValue(Class<X> type, String key);

如果您知道值将是正确的类型,无论如何,您不必传入类&lt; X&gt;,并且您可以在实现中简单地执行转换为(X)。但是,您将收到编译器警告。使用Class&lt; X&gt;传入你可以安全地进行type.cast(value),更重要的是尝试将它转换为正确的类型(如果还不是那种类型)。