2012-12-19 45 views
6

我已经实现接口B.接口没有setter方法

B ref = new A(); 

代码的具体类答:

public interface B{ 
    public abstract String[] getWords(); 
} 

public class A implements B { 
    private String[] words = new String[] {}; 
    public void setWords(String[] words){ 
    this.words = words; 
    } 
    public String[] getWords(){ 
    return this.words; 
    } 
} 

在接口B,我只有getter方法,但不虽然A类有这个方法

所以,当我这样做:B ref = new A();,这个代码将工作,我将如何设置单词?

回答

4

你要转换回原来的类型,如果接口不公开它

if (ref instanceof A) 
    ((A) ref).setWords(words); 
else 
    // something else. 

一个更好的解决方案是将方法添加到该接口。

5

如果定义为B ref = ...,您将无法致电setWords

这是在需要使用声明变量时的确切类型(或使用流延)的情况之一:

A ref = new A(); 

或者:

  • 可以创建一个C接口它扩展了B并包含两种方法并且具有A实现C.
  • 您可以在A中提供一个构造函数,它需要一个String[] words参数来初始化words字段,并且不会在al中提供setter湖

我个人倾向于后一种选择:

public class A implements B { 

    private final String[] words; 

    public A(String[] words) { 
     this.words = words; 
    } 

    public String[] getWords() { 
     return this.words; 
    } 
} 
+0

感谢所有的答复。 – Mercenary

5

所以,当我这样做:乙REF =新的A();,将这段代码工作...

是的,它会的。

...以及如何设置字词?

你将不能够除非你:

  1. 化妆A的构造带的单词列表;或
  2. add setWords() to B;或
  3. 保留对您的对象类型A的参考;或
  4. downcast ref to A

其中,我会选择1-3中的一个。最后一个选项仅用于完整性。

3
B ref = new A();//1 
ref.setWords(whatever);//2 

上面的代码将无法编译为setWords()是不是在你的interface B定义,你会得到第2行

其他在他们的答案已经表达了一个编译器错误。你有两个选择作为变通

  • 创建对象为A ref = A();
  • 向下推倒A类型,如((A)ref).setWords(watever);
0

所以,当我这样做:乙REF =新的A();,将这个代码工作

,我将如何设置的话吗?

你不行。您需要在界面中使用setter方法。

您不需要将方法定义为摘要。这是默认的抽象。