4

我对包含不带参数的泛型方法的代码感到困惑,所以这种方法的返回泛型类型是什么,例如:

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

4

2 回答 2

10

编译器从赋值的LHST上使用的具体类型推断类型。

这个链接

如果类型参数没有出现在方法参数的类型中,则编译器无法通过检查实际方法参数的类型来推断类型参数。如果类型参数出现在方法的返回类型中,那么编译器会查看使用返回值的上下文。如果方法调用显示为赋值的右侧操作数,则编译器会尝试从赋值左侧操作数的静态类型推断方法的类型参数。

链接中的示例代码与您问题中的示例代码相似:

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`
  } 
}
于 2013-07-18T12:07:15.977 回答
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
..
}
于 2013-07-18T12:19:19.797 回答