调用泛型方法如何知道泛型返回的类型?

时间:2010-03-17 20:34:30

标签: java generics runtime

我找不到Java这个问题的副本,尽管C#中有很多这样的副本。

我有这个方法:

public <T> T getSomething() {
 //
}

根据T的类型,我会得到不同的回报。例如:

String a = getSomething();
int b = getSomething();

对于a,我的方法将返回特定的String。对于b,它将返回特定的int。等等。

似乎可以在C#中使用typeof()完成此操作。我怎样才能在Java中实现它?

3 个答案:

答案 0 :(得分:1)

不幸的是,Java无法实现这一点,因为它使用了一种称为“类型擦除”的技术,允许泛型在不更改JVM的情况下工作。结果是,当调用该方法时,它所知道的只是对象,所以它无法找出预期返回的类型。

答案 1 :(得分:0)

除非getSomething方法中包含一些代码,否则您的示例不起作用。如果我写

public <T> T getSomething(){ return null;}

它编译,但它没有意义。但是,您通常会从上下文中获取T:

public class Foo<T>{ 
  public T getSomething()... 
}
new Foo<String>().getSomething()...

据推测,你的实现中必须有一些类型可识别的东西。

答案 2 :(得分:0)

在Java中,写一些类似的东西更为正常:

public <T> List<T> getSomeThings() {
    //
}

这很好用。

可能直接相当于你在C#中看到的东西会像:

public <T> T getSomething(Class<? extends T> clazz) {
    //
}

但是会使用反射,这几乎肯定是一个坏主意。当然,您可以使用沼泽标准工厂避免反射:

public <T> T getSomething(FactoryThing<? extends T> factory) {
    //
}

偶尔会出现推断返回类型有用的情况。例如,从Java序列化流中读取由于1.5之前的API设计,未经检查的强制转换警告是不可避免的。我建议用package-private方法保持这个。