Java泛型不兼容类型
我有两个扩展的抽象类和另一个使用它们的类: -----基地----- 有什么想法吗Java泛型不兼容类型,java,android,generics,Java,Android,Generics,我有两个扩展的抽象类和另一个使用它们的类: -----基地----- 有什么想法吗 事实上,这个电话 public <REQUEST_TYPE extends HttpRequest<RESPONSE_TYPE>, RESPONSE_TYPE extends HttpResponse<RESULT_TYPE>, RESULT_TYPE> void request(@NonNull final REQUEST_TYPE httpRequest, @Nullab
事实上,这个电话
public <REQUEST_TYPE extends HttpRequest<RESPONSE_TYPE>, RESPONSE_TYPE extends HttpResponse<RESULT_TYPE>, RESULT_TYPE> void request(@NonNull final REQUEST_TYPE httpRequest, @Nullable final Object tag, @Nullable final Listener<REQUEST_TYPE, RESPONSE_TYPE> listener)
{...}
行吗
此处的完整代码推理算法似乎无法推断
响应类型
。看起来这三个类型参数都应该由MockyTextRequest
给出
我不太清楚为什么规范会出现这种情况,但它与“嵌套”有关
错误可通过以下方式再现:
// same error on this line
// C (String) is not inferred
m(new ArrayList<List<String>>());
// the compiler is able to infer B from A
// but not C from A
static <A extends List<B>, B extends List<C>, C> void m(A a) {}
然后:
class MockyTextRequest
extends HttpRequest<MockyTextResponse, TextWithTitle>
public <
REQUEST_TYPE extends HttpRequest<RESPONSE_TYPE, RESULT_TYPE>,
RESPONSE_TYPE extends HttpResponse<RESULT_TYPE>,
RESULT_TYPE
> RESPONSE_TYPE synchronicRequest(
final REQUEST_TYPE httpRequest, final Object tag)
类MockyTextRequest
扩展HttpRequest
公开的<
请求类型扩展了HttpRequest,
响应类型扩展了HttpResponse,
结果类型
>响应类型同步请求(
最终请求(类型httpRequest,最终对象标记)
但这可能会使您的一些代码更加冗长
作为旁注,您应该在可能的情况下:
// vvv
class HttpRequest<RESPONSE_TYPE extends HttpResponse<?>>
//vvv
类HttpRequest实际上是否需要结果类型内部同步请求?顺便说一句,你编译的是什么版本的Java?它是Java7。我确实在函数中使用了RESULT_类型来避免castWell,我可能会想出一个聪明的解决方案,但我会说不要屏住呼吸。这看起来像是一个推理错误,Java 7充斥着这样的小东西。好吧,使用“…RESPONSE\u TYPE extensed HttpResponse…”代替它是可行的,但迫使我在主体内部强制转换一些变量。奇怪的是,另一个几乎相同的函数也可以工作(参见我的编辑)是的,编辑中的一个可以工作,因为可以从参数推断出RESULT\u TYPE
。请参阅我关于嵌套的介绍注释。它的名称为int,几乎与“HttpClient.get().request(new MockyTextRequest(),main activity.this);”的方式完全相同,但您正在将一个侦听器
传递给该方法,其中请求类型
不是“嵌套”在另一个推断类型中。
public <REQUEST_TYPE extends HttpRequest<RESPONSE_TYPE>, RESPONSE_TYPE extends HttpResponse<RESULT_TYPE>, RESULT_TYPE> void request(@NonNull final REQUEST_TYPE httpRequest, @Nullable final Object tag, @Nullable final Listener<REQUEST_TYPE, RESPONSE_TYPE> listener)
{...}
HttpClient.get().request(new MockyTextRequest(), MainActivity.this);
// same error on this line
// C (String) is not inferred
m(new ArrayList<List<String>>());
// the compiler is able to infer B from A
// but not C from A
static <A extends List<B>, B extends List<C>, C> void m(A a) {}
MockyTextResponse httpResponse =
HttpClient.get().
<MockyTextRequest, MockyTextResponse, TextWithTitle>
synchronicRequest(new MockyTextRequest(), null);
public <
RESPONSE_TYPE extends HttpResponse<RESULT_TYPE>,
RESULT_TYPE
> RESPONSE_TYPE synchronicRequest(
final HttpRequest<RESPONSE_TYPE> httpRequest, final Object tag)
public <
REQUEST_TYPE extends HttpRequest<RESPONSE_TYPE>,
RESPONSE_TYPE extends HttpResponse<?>
> RESPONSE_TYPE synchronicRequest(
final REQUEST_TYPE httpRequest, final Object tag)
public <
REQUEST_TYPE extends HttpRequest<RESPONSE_TYPE>,
RESPONSE_TYPE extends HttpResponse<? extends RESULT_TYPE>,
RESULT_TYPE
> RESPONSE_TYPE synchronicRequest(
final REQUEST_TYPE httpRequest, final Object tag)
class HttpRequest<
RESPONSE_TYPE extends HttpResponse<RESULT_TYPE>,
RESULT_TYPE
>
class MockyTextRequest
extends HttpRequest<MockyTextResponse, TextWithTitle>
public <
REQUEST_TYPE extends HttpRequest<RESPONSE_TYPE, RESULT_TYPE>,
RESPONSE_TYPE extends HttpResponse<RESULT_TYPE>,
RESULT_TYPE
> RESPONSE_TYPE synchronicRequest(
final REQUEST_TYPE httpRequest, final Object tag)
// vvv
class HttpRequest<RESPONSE_TYPE extends HttpResponse<?>>