我对我的代码感到困惑,其中包含一个不带参数的泛型方法,因此这种方法的返回泛型类型是什么,例如:
static <T> example<T> getObj() {
return new example<T>() {
public T getObject() {
return null;
}
};
}
这是通过以下方式调用的:
example<String> exm = getObj(); // it accepts anything String like in this case or Object and everything
界面example's
定义是:
public interface example<T> {
T getObject();
}
我的问题:example<String> exm
正在接受String,Object和所有内容。那么什么时候泛型返回类型被指定为String以及如何??
答案 0 :(得分:8)
编译器根据赋值的 LHS 中使用的具体类型推断出T
的类型。
来自this link:
如果类型参数未出现在方法的类型中 参数,然后编译器无法推断类型参数 检查实际方法参数的类型。如果是这种类型 参数出现在方法的返回类型中,然后是编译器 查看使用返回值的上下文。如果 方法调用显示为赋值的右侧操作数, 然后编译器尝试从中推断出方法的类型参数 赋值的左侧操作数的静态类型。
链接中的示例代码与您问题中的代码类似:
public final class Utilities {
...
public static <T> HashSet<T> create(int size) {
return new HashSet<T>(size);
}
}
public final class Test
public static void main(String[] args) {
HashSet<Integer> hi = Utilities.create(10); // T is inferred from LHS to be `Integer`
}
}
答案 1 :(得分:0)
可以执行此类通用静态声明:
example<String> x = getObj();
String s = x.getObject();//no casting required, good!
但getObject
方法变得含糊不清,因为你如何得出return
类型:
public T getObject() {
//how would this method return based on T?
//one way to always cast to T say:
//return (T) obj;
// but do you figure out obj based on T, NOT possible! due to type eraser at runtime
// a custom logic can produce diff type obj, but that's force casting and no generic usage
return null;
}
最好通过T
参数提供Class
信息作为参数:
public <T> T getObject(Class<T> clazz) {
//clazz can be used to derive return value
..
}