Android java方法-参数可以是多种类型吗?

Android java方法-参数可以是多种类型吗?,java,android,methods,Java,Android,Methods,我是java/android新手,非常感谢您的帮助。我希望我的java方法能够为参数接受多种类型。例如,变量myButton可以是ImageButton,也可以只是一个按钮。myButton函数中的代码对myButton是ImageButton还是Button有效 if (condition) { ImageButton myButton = (ImageButton) findViewById(R.id.myButtonID); myFunction(myButton); }

我是java/android新手,非常感谢您的帮助。我希望我的java方法能够为参数接受多种类型。例如,变量myButton可以是ImageButton,也可以只是一个按钮。myButton函数中的代码对myButton是ImageButton还是Button有效

if (condition) {
    ImageButton myButton = (ImageButton) findViewById(R.id.myButtonID);
    myFunction(myButton);
} else {
    Button myButton = (Button) findViewById(R.id.myButtonID);
    myFunction(myButton);
}

public void myFunction(Button or ImageButton myButton) {
    ....identical code for myButton which could be an ImageButton or Button....
}

显然,我可以为参数类型编写两个函数,并在适用时调用它,但这似乎是一种浪费,必须有一种更快的方法。我该怎么做?感谢您的帮助。

如果两个类都有一个可在方法中使用的公共接口,您可以使用它并捕获这两种类型


否则,您可以使用或方法。

取决于该方法对传入的参数所做的操作

通常,你会使用。看看遗传图

ImageButton extends ImageView extends View extends Object

最具体的常见超类是View。如果该方法可用于视图,则应将参数类型指定为视图:

如果该方法对ImageButtons和Buttons执行不同的操作,则可以使用。即,采用不同参数的两种方法:

public void myFunction(ImageButton imageButton) {
    //...
}

public void myFunction(Button button) {
    //...
}
在极少数情况下,基于的解决方案也能起作用。请注意,编译器实际上会为传入的每种不同类型生成代码的副本,因此,如果可以:

public <ParamType extends View> void myFunction(ParamType param) {
    //...
}

您应该使用按钮和ImageButton的公共超类,例如View,然后:

public void myFunction(View view) {
    if(view instanceof Button) {
        Button btn = (Button) view;
        // do something with Button instance
    }

    if(view instanceof ImageButton) {
        ImageButton iBtn = (ImageButton) view;
        // do something with Image Button instance
    }
}

Java的经典方法重载会有所帮助。这就是我如何将泛型应用于我的简单案例?听起来继承是解决方案。将函数参数声明为普通超类型。需要使用反射instanceof通常是一种代码气味,表明存在设计问题。Button和ImageButton正在执行相同的操作…因此相同的代码将重复两次,这有点低效。我同意laalto关于反射的观点。使用提供的源代码将更容易找到最佳解决方案。
public <ParamType extends View> void myFunction(ParamType param) {
    //...
}
public void myFunction(View view) {
    if(view instanceof Button) {
        Button btn = (Button) view;
        // do something with Button instance
    }

    if(view instanceof ImageButton) {
        ImageButton iBtn = (ImageButton) view;
        // do something with Image Button instance
    }
}