簡體   English   中英

關於Java方法和實現多個接口的參數

[英]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個基本選項:

  1. 創建一個擴展兩者的通用接口,並將其用作您的參數類型:

     interface FatherAndTeacher extends Father, Teacher { } 

    問題在於沒有實現該接口的對象不匹配。

  2. 使用泛型,您可能需要匹配的對象才能實現兩個接口:

     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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM