你不能用T作为全局变量吗?

时间:2015-01-25 06:44:31

标签: java generics

我有以下内容:

public class foo {
public static Request<T> request;

public void doSomething()
{
 request = getRequest();
}
}

但是编译器说它cannot Resolve Symbol T

然而这有效:(即T是定义并且它构建。)

public class foo{   

 public void doSomething()
 {
  Request<T> request = getRequest();
 }
}
我在这里错过了一些简单的东西吗?

请求是解决方案中存在的公共类。出于兴趣,它是Google排球类。

getRequest()是一个返回Request<T>

的函数

真实代码:

 public class Network {
 //Used to get Last Request
 public static Request<T> previousRequest;

 ...

 public <T> void addToRequestQueue(Request<T> req) {
    req.setRetryPolicy(new DefaultRetryPolicy(30000, 1, 2));
    try {
        req.getHeaders().put("Authorization", "Bearer " + getToken());
    } catch (AuthFailureError e) {
        e.printStackTrace();
    }
    Log.d(TAG, PrintRequest(req));
    previousRequest = req;     <<<<<<<<<<<<******* incomparable Types error
    getRequestQueue().add(req);
}

...

}

1 个答案:

答案 0 :(得分:1)

addToRequest 编译,因为您正在定义一个通用方法。方法定义的语法(在结果类型之前放置<T>)告诉编译器您正在定义泛型方法。此语法定义 T,以便您可以在方法的其余部分中使用它。同样,public class SomeClass<T> 定义 T,因此您可以在课程的其余部分中使用它。但是其他语法没有定义泛型参数,包括这个:

public static Request<T> previousRequest;

这不是泛型变量的定义(没有这样的东西),因此它没有定义T。因此,必须在其他地方定义T。在你的例子中,它不是。 (为通用方法T定义的addToRequestQueue仅为该方法定义,并且在方法外声明previousRequest。)