没有参数的通用方法

时间:2013-07-18 12:01:46

标签: java generics

我对我的代码感到困惑,其中包含一个不带参数的泛型方法,因此这种方法的返回泛型类型是什么,例如:

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以及如何??

2 个答案:

答案 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
..
}