接口中没有setter方法

时间:2012-12-19 10:49:02

标签: java inheritance interface

我有一个实现接口B的具体类A.

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方法但没有setter方法,尽管A类有它。

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

5 个答案:

答案 0 :(得分:5)

如果将setWords定义为B ref = ...,您将无法在其上调用A ref = new A();

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

String[] words

可替换地:

  • 您可以创建一个扩展B的接口C,它包含两种方法并具有A工具C.
  • 你可以在A中提供一个构造函数,它使用words参数初始化你的public class A implements B { private final String[] words; public A(String[] words) { this.words = words; } public String[] getWords() { return this.words; } } 字段,而根本不提供setter。

我个人赞成后一种选择:

{{1}}

答案 1 :(得分:5)

  

所以当我这样做时:B ref = new A();,这段代码会起作用吗......

是的,它会。

  

......我将如何设置单词?

除非你:

,否则你将无法胜任
  1. 使A的构造函数获取单词列表;或
  2. setWords()添加到B;或
  3. 为您的对象保留A类型的引用;或
  4. 向下转发refA
  5. 其中,我会选择1-3中的一个。最后一个选项仅包括完整性。

答案 2 :(得分:4)

如果界面确实暴露了它,你必须回到原始类型

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

更好的解决方案是将方法添加到界面。

答案 3 :(得分:3)

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

上面的代码无法编译,因为setWords()中未定义interface B,您在第2行会遇到编译错误。

正如其他人已经在答案中表达的那样。你有两个选择作为解决方法

  • 将对象创建为A ref = A();
  • 将引语向下倾斜为类似((A)ref).setWords(watever);

答案 4 :(得分:0)

  

所以当我这样做时:B ref = new A();,这段代码是否可行

  

我将如何设置单词?

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

在您之间不需要将方法定义为抽象。它默认是抽象的。