繁体   English   中英

Java初学者-多态和接口

[英]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.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM