Java接口作为方法的参数

时间:2016-10-23 20:58:14

标签: java android methods interface arguments

在某些Java方法中,我看到需要一个Interface参数。 由于无法实例化接口,这是否意味着实现此接口的每个类的对象都可以作为参数传递?

例如,在Android中的ListView类的setOnClickListener方法中,

setOnItemClickListener(AdapterView.OnItemClickListener listener)

需要OnItemClickListener接口(嵌套在AdapterView抽象类中)作为参数。

这里需要传递什么样的物品?

提前谢谢。

3 个答案:

答案 0 :(得分:2)

是 - 如果需要接口类型作为参数,则可以传递其类实现此接口的任何对象。

示例:

// the method
void myMethod(MyInterface object) { ... }

// the interface
interface MyInterface {

    void interfaceMethod();

}

// class implementing the interface
class MyImplementation implements MyInterface {

    void interfaceMethod() {
        // ...
    }

}

你现在可以这样做

MyInterface object = new MyImplementation();
myMethod(object);

希望这有帮助!

答案 1 :(得分:0)

What Is an Interface?给出了很好的解释

  

实现接口允许类对其承诺提供的行为更加正式。

因此,您可以使用所需的接口实现任何类,并提供此类的对象作为侦听器。您也可以将该接口实现为匿名内部类,就像在Android开发中广泛完成一样。

setOnItemClickListener(new AdapterView.OnItemClickListener(){
    @Override
    public void onItemClick(AdapterView<?> parent, View view, int position, long id) {
        ....
    }
});

答案 2 :(得分:0)

好吧,似乎坚定地制定一个问题可以帮助人们更好地消化它。

如果我们坚持以下事实:

  1. 实现接口的类的对象可以合法地作为参数传递给只需要实现接口的方法(不需要转换?)。
  2. 接口变量可以保存实现此接口的类的创建对象BUT(没有显式转换)只能访问接口方法,只能访问它们(即使对象可能是带有其他方法的类)
  3. 如果只需要一次,可以使用 new 关键字和“Interface构造函数”在需要接口的情况下即时创建匿名类的对象,并自动实现该接口。 / LI>

    所以在我看来,似乎是以下代码:

    setOnItemClickListener(new AdapterView.OnItemClickListener(){
    @Override
    public void onItemClick(AdapterView<?> parent, View view, int position, long id) {
        ....
    }
    

    });

    实例化一个自动实现 AdapterView.OnItemClickListener 接口的匿名类,在线覆盖 onItemClick()方法并将对象传递给 setOnItemClickListener 功能。

    为了更清楚,上面的代码可以写成:

    class classDef implements AdapterView.OnItemClickListener{
       @Override
       public void onItemClick(AdapterView<?> parent, View view, int position, long id) {
                ....
            }
        }
        classDef myClass = new classDef();
        setOnItemClickListener(myClass);
    

    谢谢。