Java 未编译带有通配符的泛型
未编译以下代码:Java 未编译带有通配符的泛型,java,generics,interface,wildcard,Java,Generics,Interface,Wildcard,未编译以下代码: public class Example { public void method() { Callback<BaseResponse> br = null; Request<? extends BaseResponse> req = null; req.startRequest(br); //compile-time error here!! } public interfac
public class Example {
public void method() {
Callback<BaseResponse> br = null;
Request<? extends BaseResponse> req = null;
req.startRequest(br); //compile-time error here!!
}
public interface Callback<T> {
void onResponse (T response);
void onFailure (String error, int code);
void onFailure (Throwable t);
}
public static class BaseResponse {
public String status;
}
public interface Request<BaseResponse> {
void startRequest(Callback<BaseResponse> callback);
}
}
公共类示例{
公开作废法(){
回调br=null;
请求您的问题就在这条线上
public interface Request<BaseResponse> {
或者类似的东西。我们应该忽略将要抛出的NullPointerException
?您可以包含一些实际的代码吗?不确定为什么在将变量设置为null后要取消对该行的引用。@DimaSan,OP明确地说,如果我去掉了扩展部分,代码就会编译,但我需要它。@SeanBright sure,没有注意到这一点,谢谢你的评论。这非常有效。我的真实代码中实际上有t extends BaseResponse
,但它给了我编译时错误。我认为这实际上是由NetBeans中的一些错误造成的。错误是不兼容的类型:回调无法转换为回调,其中CAP#1是一个新的类型变量:CAP#1从捕获扩展BaseResponse开始扩展BaseResponse。这在NetBeans中不是一个错误。千万不要因为工作质量而责怪工具。通配符泛型对变量声明没有好处,因为无法判断要使用什么类型。?
表示“未知类型”,显然,这不能作为类型声明。捕获失败与此类似;您未共享的代码试图将“未知类型”等同于特定类型,而编译器无法对此进行验证。
public interface Request<T extends BaseResponse> {