我有一个实现接口的类,但有一些额外的方法。我无法编辑接口以添加任何额外的方法,该接口的一种方法返回一种接口本身。
public interface ExampleInterface{
public ExampleInterface method1();
}
该类有一个我想使用的额外方法,它将打印该类的内容。
public class ExampleInterfaceImpl implements ExampleInterface {
public ExampleInterface method1() {
//method code
}
public void print() {
//print method code
}
}
所以我的问题是我是否有 ExampleInterface 类型的对象,即 method1()返回的对象,然后我想用打印它print(),如果 print()在 ExampleInterfaceImpl 中,怎么办呢,所以不能在 ExampleInterface类型的对象上调用
答案 0 :(得分:1)
检查ExampleInterface
对象是否为instanceof ExampleInterfaceImpl
。然后你可以把它投射到那个并调用方法 - ((ExampleInterfaceImpl)object).print();
。
答案 1 :(得分:1)
public void maybePrint(ExampleInterface obj) {
if (obj instanceof ExampleInterfaceImpl) {
((ExampleInterfaceImpl)obj).print();
}
}
这适用于特定的实现类,但是如果你有几个不同的实现可能会或可能不会实现print()方法(在这种情况下,你应该使用print()方法创建一个子接口,并在所有适用的课程。)
还可以使用反射来检查对象的类是否具有print()
方法,但这不是很优雅,也不推荐。
答案 2 :(得分:1)
如果你真的无法修改界面,你将不得不求助于runttime类型检查和转换:
if (myObject instanceof ExampleInterfaceImpl) {
((ExampleInterfaceImpl) myObject).print();
}
答案 3 :(得分:1)
如果您无法更改界面,我建议您添加一个可以使用的界面。
interface MyExampleInterface extends ExampleInterface {
MyExampleInterface method1();
void print();
}
class MyExampleInterfaceImpl implements MyExampleInterface {
// later
MyExampleInterface mei = new MyExampleInterfaceImpl();
mei.method1().print();
答案 4 :(得分:1)
首先来自评论@RealSkeptic,对您的问题实施toString
方法是正确的。如果不是
更好的设计是创建另一个可以Printable
喜欢
public interface Printable {
void print();
}
并实现所有可打印的类,在您的情况下为ExampleInterfaceImpl
并检查对象类型,如下所示
if(object instanceof Printable) {
Printable object = (Printable) object; //this can be ExampleIntefaceImpl object
object.print(); //is valid
}
答案 5 :(得分:1)
如果object存储在接口引用中,则需要将该引用强制转换为具体类。
ExampleInterface exampleInterface = new ExampleInterfaceImpl();
((ExampleInterfaceImpl)exampleInterface).print();
答案 6 :(得分:1)
所以我的问题是我是否有一个类型为ExampleInterface的对象,即 method1(),
返回的内容
您可以通过引用接口类型ExampleInterface
来创建类MyExampleInterfaceImpl
的对象
ExampleInterface mei = new MyExampleInterfaceImpl();
当您调用method1()
,即mei.method();
时,它只是从已实现接口ExampleInterface
的具体类中调用该方法
怎么能看到print()在
中
简单地将ExampleInterface
的引用变量显式转换为MyExampleInterfaceImpl()
然后调用方法print()
((ExampleInterfaceImpl)mei).print();