[英]Java Beginner - Polymorphism and Interfaces
在Java中,有什么方法可以在其父引用类型变量中创建子对象,并且仍然可以访问任何已实现的接口,而无需转换为接口类型,也可以不使用接口引用来存储对象?
几乎看起来像手工多态。
不,这是不可能的或不适当的。 我们使用对父类/接口的引用来将该对象用于某些抽象功能。 例如:
public interface Command {
public void execute();
}
public class SomeCode implements Command { }
public class SomeOtherCode implements Command { }
public class Test {
public Test {
List<Command> list = new ArrayList<>();
list.add(new SomeCode());
list.add(new SomeOtherCode());
runCommands(list);
}
public void runCommands(List<Command> list) {
for (Command c : list)
list.execute();
}
}
因此,我们使用了在命令之间共享的抽象功能(execute())。 如果要使用特定方法,则在逻辑上必须使用强制转换。 那是引用超类/接口的要点,也是使用强制转换的要点。
即使它可以列出所有实现的接口,我会尽量避免它尽可能的,因为它闻起来像不好的设计,它肯定不是做一个普通的事情。
另一方面,要做的很普通的事情是测试对象是否是某个类/接口的子类型。 看这个演示:
class Parent { }
interface MyInterface {
void foo();
}
class Child extends Parent implements MyInterface {
@Override
public void foo() {
System.out.println("Foo");
}
}
void main() throws Exception {
List<Parent> list = new ArrayList<>();
list.add(new Parent());
list.add(new Child());
for (Parent p : list) {
if (p instanceof MyInterface) {
MyInterface cased = (MyInterface) p;
cased.foo();
}
}
}
在这里,您有一个Parent
的列表,并且对于所有所有都实现MyInterface
您可以做一些特殊的事情,甚至在对对象进行MyInterface
之后都可以从MyInterface
调用方法。
如果您确实需要列出所有接口,请使用反射 :
void main() throws Exception {
List<Parent> list = new ArrayList<>();
list.add(new Parent());
list.add(new Child());
for (Parent p : list) {
Class<?>[] interfaces = p.getClass().getInterfaces();
for (Class<?> i : interfaces) {
Method firstMethod = i.getMethods()[0];
firstMethod.invoke(p, new Object[0]);
}
}
}
这段代码将查看列表中每个Parent
对象实现的所有接口,并从对象上的每个接口调用first方法。
但是,很少需要反射(我在编程的2年中使用过一次)。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.