- c - 在位数组中找到第一个零
- linux - Unix 显示有关匹配两种模式之一的文件的信息
- 正则表达式替换多个文件
- linux - 隐藏来自 xtrace 的命令
我试图在 Retrofit
上创建一个包装器来抽象我的服务实现。到目前为止,我已经让编译器成功编译:
package com.example.spark.testapp.services;
import com.example.spark.testapp.services.apis.Get;
import com.example.spark.testapp.services.apis.Post;
import com.example.spark.testapp.services.utils.*;
import com.example.spark.testapp.services.utils.Error;
import java.util.List;
import retrofit2.Call;
import retrofit2.Callback;
import retrofit2.Response;
import retrofit2.Retrofit;
public class ServiceLayer {
public <T> void performGet(String url, final Class<Get<T>> clazz, com.example.spark.testapp.services.utils.Callback<T> callback) {
Retrofit retrofit = new Retrofit.Builder().baseUrl("").build();
Get<T> service = retrofit.create(clazz);
//Pass authentication token here
Call<T> t = service.get(url, "");
executeCallback(callback,t);
}
public <T> void performPost(String url, final Class<Post<T>> clazz,com.example.spark.testapp.services.utils.Callback<T> callback) {
Retrofit retrofit = new Retrofit.Builder().baseUrl("").build();
Post<T> service = retrofit.create(clazz);
//Pass authentication token here
Call<T> t = service.post(url, "");
executeCallback(callback,t);
}
public <T> void executeCallback( final com.example.spark.testapp.services.utils.Callback<T> callback , Call<T> call) {
call.enqueue(new Callback<T>() {
@Override
public void onResponse(Call<T> call, Response<T> response) {
callback.onSuccess(response.body());
}
@Override
public void onFailure(Call<T> call, Throwable t) {
///Find out what exactly went wrong. Populate Error. and then...
com.example.spark.testapp.services.utils.Error e = new Error();
callback.onFailure(e);
}
});
}
}
编译时,问题出在调用方法时:
private void getString() {
ServiceLayer s = new ServiceLayer();
s.performGet("",Get<String>.class,this); //Cannot select from parameterised type
}
我用 Google 搜索了一下,发现由于类型删除,这是不可能的。美好的。
但我的问题是,编译器不应该在这里报错吗?在这条线上? :
public <T> void performGet(String url, final Class<Get<T>> clazz, com.example.spark.testapp.services.utils.Callback<T> callback)
我的服务层是如何编译的?
编辑
这个问题似乎被误解了。我不是在寻找一种方法来让这个设计发挥作用。我理解其中的缺陷,并且我们找到了一种更好的分层服务方式。问题是关于语言本身的有趣/奇怪的行为。
最佳答案
But my question is, shouldn't the compiler raise an error here?
方法签名在 Java 中是完全正确的。泛型方法签名受与普通方法相同的规则控制。
在泛型方法中,您可以在代码中执行的操作取决于参数类型。例如,如果您有此方法:
public static <T> void test(List<T> list, Class<T> clazz)
throws InstantiationException, IllegalAccessException
{
list.add(clazz.newInstance());
}
它可以编译,但是如果我们添加下一行:
list.add(new Integer(1));
不会因为在编译时list
只接受 T
的实例.因此泛型方法定义明确。
当您尝试调用泛型方法时,编译器无法推断 T
从参数。主要问题显然是 Class<Get<T>>
构造,在方法签名中有效但不推荐。虽然,你可以做一个不安全和奇怪的转换来使方法调用编译和工作:
s.performGet("",(Class<Get<String>>)(Class) Get.class,this);
执行此转换链,编译器现在可以推断出 T
,因为泛型类型只在编译时检查。在运行时,Class<Get<T>>
永远是Get.class
.
关于这个主题的一些相关问题:
关于java - 在 Android 中将嵌套的 Class<MyInterface<T>> 作为参数传递,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/36443094/
我刚刚遇到了一段代码,它的作用是: public interface MyInterface> {...} 然后类似乎可以: public final class MyClass implements
我有一个错误,我不明白,我有一个json,我做了一个接口,当我试图循环它时,我在我的html中得到了一个错误。。JSON格式对我来说相当复杂。。谢谢。。图片中的错误。杰森。接口。服务。Ts.file。
首先让我说我对使用接口(interface)还很陌生。 我正在编写一个方法 (GetClaimDetails),它将返回有关医疗保险 claim 的信息。如果是声明类型 A,它将返回 ClaimDet
出于渲染顺序的目的,我正在尝试对 ArrayList 进行排序通过每个对象中两个整数的总和。 ArrayList 中的对象实现相同的接口(interface)但没有共同的母类。 class A imp
我是Spring新手,正在学习AOP。我的要求是我必须为所有实现 MyInterface 的类应用 ThrowsAdvice。我看过很多针对单节课进行解释的教程。但我正在寻找实现 MyInterfac
项目结构需要在单独的文件中定义接口(interface)和实现。 最好下载一个独立的小测试用例来获取图片,但这里也有代码。这是一个库项目,这就是为什么 mylib 被声明为每个文件的包。我想有子包,但
我的目标是将所有的静态类反射(reflect)到一个容器类中,收集到一个simpleName -> class的映射中。 . 这可以“手动”完成,没有问题,但我真的很想以编程方式完成。 例如,给定:
我仍在学习一些 C# 内容,但我找不到这个问题的答案。假设我有一个实现 MyInterface 的 MyObject 列表 public class MyObject : IMyInterface {
我正在用 java 编写一段代码,想封装我的对象并仅返回接口(interface)。 现在简而言之,这是我的问题,我有一个包含列表的类,并且我有一个返回列表的 getter。如何返回接口(interf
我最近将我的 java 版本从 java 1.7 升级到了 java 1.8。升级后我收到此错误。 原因:ECMAScript 异常:类型错误:找不到 ScriptObject 和我的接口(inter
我有这样的东西: 我在SO上发现了类似的问题:How can I check if element is an instanceof U? ,但它只是展示了如何实现 OfType ,不是OfType>
我试图在 Retrofit 上创建一个包装器来抽象我的服务实现。到目前为止,我已经让编译器成功编译: package com.example.spark.testapp.services; impor
跟进问题 a previous question ,这已被确定为协方差问题。更进一步,如果我按如下方式修改 IFactory: class Program { static void Main
当 MyStruct 实现 MyInterface 时,如何将 map[string] MyStruct 转换为 map[string] MyInterface。 type MyInterface i
我有一个 Java 8 项目和一个 JBoss 7.1.0GA 服务器。我有一个带有全局变量的批处理类 @EJB public MyInterface delegate; 它在我的 ejb-jar.x
由于 StatelessComponent 已被弃用,我正在尝试将所有组件转换为类。 我有一个接口(interface),例如: interface MyInterface{ prop1: n
我是一名优秀的程序员,十分优秀!