首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >界面问题

界面问题
EN

Stack Overflow用户
提问于 2008-09-30 22:32:56
回答 10查看 695关注 0票数 4

假设我有一个接口MyInterface和两个实现MyInterface的类A、B。

我声明了两个对象:MyInterface a = new A()MyInterface b = new B()

当我试图传递给函数-函数doSomething(A a){}时,我得到了一个错误。

这是我的代码:

代码语言:javascript
复制
public interface MyInterface {}

public class A implements MyInterface{}

public class B implements MyInterface{}

public class Tester {

    public static void main(String[] args){
        MyInterface a = new A();
        MyInterface b = new B();
        test(b);
    }

    public static void test(A a){
        System.out.println("A");
    }

    public static void test(B b){
        System.out.println("B");
    }

}

我的问题是,我是从一些组件接口获取的,这些接口可以是各种类型的类,我需要为每个类编写函数。

因此,一种方法是获取接口并检查它是哪种类型。(A的实例)

我想知道别人是如何处理这个问题的??

Thx

EN

回答 10

Stack Overflow用户

发布于 2008-09-30 22:39:18

你能不能只在每个类实现的接口上有一个方法?或者你不能控制界面?

这将提供多态性,并避免定义任何外部方法的需要。我相信这就是接口的意图,它允许客户端以一种非特定类型的方式对待所有实现它的类。

如果您不能添加到接口,那么您最好使用适当的方法引入第二个接口。如果既不能编辑接口,也不能编辑类,那么就需要一个将接口作为参数的方法,然后检查具体的类。然而,这应该是最后的手段,它颠覆了接口的使用,并将方法绑定到所有实现。

票数 5
EN

Stack Overflow用户

发布于 2008-09-30 22:44:53

听起来你想要的是这样的东西:

代码语言:javascript
复制
public static void test(MyInterface obj){
  if(obj instanceof A) {
     A tmp = (A)obj;
  } else if(obj instanceof B) {
     B tmp = (B)obj;
  } else {
     //handle error condition
  }
}

但请注意,这是非常糟糕的形式,表明您的设计中出现了严重的错误。如果您无法控制接口,那么,正如marcj所建议的,添加第二个接口可能是可行的。注意:你可以在保持二进制兼容性的同时做到这一点。

票数 3
EN

Stack Overflow用户

发布于 2008-09-30 22:38:35

我不清楚您实际问的是什么,但问题是您没有一个接受MyInterface类型参数的方法。我不知道Java中确切的语法是什么,但你可以这样做,比如If (b is B) { test(b as B) },但我不会这样做。如果你需要它是泛型的,那么使用MyInterface类型作为变量类型,否则使用B作为变量类型。您正在违背使用该接口的目的。

票数 2
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/155388

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档