[英]About Java method & a parameter which implements multiple interfaces
我正在編寫Java應用程序,並且有一個問題。 如何使用一個參數實現一個函數, 該參數應該需要一個實現多個接口的參數? 例如:
interface Father
{
}
interface Teacher
{
}
public void foo(FatherAndTeacher person) // How do I do this?
{
// Do something
}
我知道我可以使用兩個參數,例如:
public void foo(Father person1, Teacher person2)
{
// Do something
}
但我認為也許有一個實現兩個接口的參數會更好。
您可以通過擴展教師界面和父親界面來使用復合界面。
這是一個例子:
interface Teacher
{
void teach();
}
interface Father
{
void makeBadJoke();
}
// ----- Composite interface! Doesn't add any methods.
interface TeacherAndFather extends Teacher, Father
{
/*This can be empty*/
}
class Bob implements TeacherAndFather
{
public void teach() { System.out.println("1 + 1 = 2"); }
public void makeBadJoke() { System.out.println("Knock knock..."); }
}
class Main
{
private static void foo(TeacherAndFather foo)
{
foo.teach();
foo.makeBadJoke();
}
public static void main (String... args)
{
foo(new Bob());
}
}
兩個強制參數具有2個接口,您有2個基本選項:
創建一個擴展兩者的通用接口,並將其用作您的參數類型:
interface FatherAndTeacher extends Father, Teacher { }
問題在於沒有實現該接口的對象不匹配。
使用泛型,您可能需要匹配的對象才能實現兩個接口:
public <T extends Father & Teacher> void foo(T person) { // Do something }
請注意,這僅適用於接口,即您不能T extends Number & String
(2類)。 但是,它只能在一個對象邊界上工作,在這種情況下,該類必須是第一個: T extends ConcretePerson & Father
還可以,但是T extends Father & ConcretePerson
則不能(其中ConcretePerson
是類)。
只需使用Object作為您的函數參數類型:
void doSomething(Object param);
或使用通用方法:
<T> void doSomething(T param);
或讓兩個接口都從同一個接口繼承。
public interface Person {}
public interface Teacher extends Person {}
public interface Father extends Person {}
public class Test {
public void foo(Person p) {
//
}
}
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.