我有一个实现接口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();
,这段代码会起作用,我将如何设置单词?
答案 0 :(得分:5)
如果将setWords
定义为B ref = ...
,您将无法在其上调用A ref = new A();
。
这是在声明变量(或使用强制转换)时需要使用确切类型的情况之一:
String[] words
可替换地:
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();,这段代码会起作用吗......
是的,它会。
......我将如何设置单词?
除非你:
,否则你将无法胜任A
的构造函数获取单词列表;或setWords()
添加到B
;或A
类型的引用;或ref
至A
。其中,我会选择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行会遇到编译错误。
正如其他人已经在答案中表达的那样。你有两个选择作为解决方法
答案 4 :(得分:0)
所以当我这样做时:B ref = new A();,这段代码是否可行
是
我将如何设置单词?
你做不到。您需要在界面中使用setter方法。
在您之间不需要将方法定义为抽象。它默认是抽象的。