我找不到Java这个问题的副本,尽管C#中有很多这样的副本。
我有这个方法:
public <T> T getSomething() {
//
}
根据T的类型,我会得到不同的回报。例如:
String a = getSomething();
int b = getSomething();
对于a
,我的方法将返回特定的String
。对于b
,它将返回特定的int
。等等。
似乎可以在C#中使用typeof()
完成此操作。我怎样才能在Java中实现它?
答案 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方法保持这个。