这两段代码有什么区别
btn.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
}
});
是View类的内部接口,如果是这样,我们知道接口无法实例化
在这里
soInterface.getAnswers().enqueue(new Callback<SOAnswersResponse>() {
@Override
public void onResponse(Call<SOAnswersResponse> call, retrofit2.Response<SOAnswersResponse> response) {
}
@Override
public void onFailure(Call<SOAnswersResponse> call, Throwable t) {
}
});
它在enqueue方法中需要的回调,这个语法定义的是接口“CallBack&lt;&gt;”定义了一些在哪里,我们在这里调用它作为内联接口,但是再次接口无法实例化,如回调语法说“new CallBack(){}”
答案 0 :(得分:1)
这两段代码有什么区别
两者都是2个不同的界面
View.OnClickListener
- 此界面可帮助您收听查看点击操作
Callback<SOAnswersResponse>
- 尝试从服务器获取响应
答案 1 :(得分:1)
它们都是接口:
CallBack表示Retrofit的响应(回调),当它出现时你进入onResponse或者它无法回复(在10s时间范围内),被读取(错误解析)或其他原因然后onFailure将被执行。
onClickListener将按下按钮点击。
您可以在Activity或Fragment中实现onClick侦听器的接口,并使用button.setOnClickListener(this)与Retrofit相同。
答案 2 :(得分:0)
View.OnClickListener
和Callback
都是接口。
OnClickListener
嵌套在View
类中。改造Callback
不是嵌套的。
这是Callback
界面doc:https://square.github.io/retrofit/2.x/retrofit/retrofit2/Callback.html
接口无法实例化
我们在这里实例anonymous class
。即我们将interface
实现为anonymous class
并动态实例化anonymous class
。
来自Java doc:
他们[匿名类]使您能够声明和实例化一个类 同时。他们就像当地的班级,但他们没有 有一个名字。如果您只需要使用本地类一次,请使用它们。
答案 3 :(得分:0)
这种情况下的两个类都是带回调的接口。匿名类实现View.OnClickListener
,它在onClick
上有回调。实现Callback<SOAnswersResponse>()
的匿名类也是如此。这次它有一个类型参数和两个onResponse
和onFailure
的回调。
接口无法实例化的声明是正确的,但您可以创建它的匿名类。见Can we create an instance of an interface in Java?
答案 4 :(得分:0)
您更正了,无法实例化界面。接口是必须由具体类实现的一组方法的定义。
在两种情况下,您的代码使用的是匿名内部类。 Java语法允许您指定您想要一个新的实例&#39;实现指定的接口,但你不想写所有代码来做到这一点。您的代码仅提供该接口定义的抽象方法的实现。
如果查看应用程序的类文件,您将看到类似MyClass $ 1.class的内容,它是由编译器综合生成的类文件。编译器创建一个名为MyClass $ 1的类,它实现了您使用已定义的方法指定的接口。然后编译器会在编译之前使代码看起来像这样:
Gender
{
int GenderID
GenderType
}
SeriesCategory
{
int SeriesCategoryID
string SeriesCategoryName
int GenderID
}
Region
{
int RegionID
string RegionName
int SeriesCategoryID
}
Series
{
int SeriesID
string SeriesName
int RegionID
int SeriesCategoryID
}
这同样适用于第二个例子,但具有不同的界面等。