2017-05-08 55 views
0

我正在编写一个Java应用程序,并且有一个问题。我怎样才能实现一个一个参数,它应该需要一个实现多个接口的参数?例如:关于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 
} 

,但我想,也许具有实现两个接口将是更好的参数。

+0

我认为你需要展示一个很好的代码示例。我不觉得这是非常清楚的。 – Carcigenicate

+0

是的,可以在Java中实现两个接口。但是,仍然不清楚你要求什么,你可以更具体一点吗?可能是举例吗? –

+0

我已经重写了你的问题,希望能让它更清楚。如果我误解了你的问题,请随时编辑你的问题:) – Michael

回答

1

两个强制参数有你有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是一个类)。

+1

@迈克尔你是对的,他没有添加它。我相应地调整了答案。 – Thomas

+0

非常感谢你! :)^ v ^,我得到了成功,非常感谢你:)^v ^。 – WaterMoon

+0

@WaterMoon不用客气。请注意,您应该接受其中一个工作答案。 :) – Thomas

0

只使用对象为你的函数参数类型:

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) { 
     // 
    } 
} 
+0

除了在这种情况下,你可以将事情传递给**既不是老师也不是父亲。 – Michael

+0

是的,foo函数本身应该检查参数是Teathcer或父亲的实例 – treesong

+1

很高兴能够在编译时强制执行它:) – Michael

1

您可以通过扩展Teacher和Father接口来使用复合接口。

下面是一个例子:

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()); 
    } 
} 
+1

这是一个很好的方式,非常感谢。我以为这样,有时我想要创建更少的接口。谢谢。 :) – WaterMoon

+0

@WaterMoon不客气。记住点击任何答案解决您的问题旁边的复选标记。 – Michael