我想知道实现接口和创建它的实例有什么区别,这里是一个代码示例,这段代码允许使用ResultReceiver在IntentService和Activity之间进行通信。
MySimpleReceiver类 :
public class MySimpleReceiver extends ResultReceiver {
public static final Creator CREATOR = null;
private Receiver receiver;
// Constructor takes a handler
public MySimpleReceiver(Handler handler) {
super(handler);
}
// Setter for assigning the receiver
public void setReceiver(Receiver receiver) {
this.receiver = receiver;
}
// Defines our event interface for communication
public interface Receiver {
void onReceiveResult(int resultCode, Bundle resultData);
}
// Delegate method which passes the result to the receiver if the receiver
// has been assigned
@Override
protected void onReceiveResult(int resultCode, Bundle resultData) {
if (receiver != null) {
receiver.onReceiveResult(resultCode, resultData);
}
}
}
这是从服务接收数据时设置回调的最佳方法:
在MainActivity中实施MySimpleReceiver.Receiver
接口:
public class MainActivity extends Activity implements MySimpleReceiver.Receiver
{
@Override
public void onReceiveResult(int resultCode, Bundle resultData) {
//
}
}
或在MainActivity中创建界面实例:
public class MainActivity extends Activity {
public MySimpleReceiver receiverForSimple;
// Setup the callback for when data is received from the service
public void setupServiceReceiver() {
receiverForSimple = new MySimpleReceiver(new Handler());
// This is where we specify what happens when data is received from the
// service
receiverForSimple.setReceiver(new MySimpleReceiver.Receiver() {
@Override
public void onReceiveResult(int resultCode, Bundle resultData) {
if (resultCode == RESULT_OK) {
String resultValue = resultData.getString("resultValue");
Toast.makeText(MainActivity.this, resultValue, Toast.LENGTH_SHORT).show();
}
}
});
}
}
和有什么区别?感谢
答案 0 :(得分:3)
你不能"创建一个实例"接口,只是实现它的类的实例。
接口只不过是一个严格约束的合同,你必须完全实现它。
一个类是一个已实现的功能。
您提供的示例显示您在匿名类中重写了MySimpleReceiver.Receiver。看起来你正在实例化一个界面,但事实并非如此。此类没有名称(因此是匿名的),但其实现包含在新语句后面的大括号中。
匿名类非常有用,但难以阅读,特别是如果您习惯使用旧版本的Java或其他不支持此类代码的语言。
请参阅the tutorial on anonymous classes here
如果您想以任何方式重用类,您将使用第一个示例(直接实现)。它使你的解决方案有点大。
第二个例子很棒,如果您只使用一次并且不希望解决方案中的类文件数量激增。
答案 1 :(得分:0)
您无法创建界面实例。 您只能创建实现该接口的类实例。 示例:
interface Calculate{
void doCalculation();
}
class Sample implements Calculate{
@Override
void doCalculation(){
//TODO Write your code to calculate
}
}
// // =======================================
Calculate calculate = new Sample();
calculate.doCalculation();