微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

Java – 从接口到实现的动态类转换

我已经阅读了其他相关的帖子,但仍然不太清楚如何,或者是否可以在 Java中动态地(实现的接口).我的印象是我必须用反思去做.

我正在开展的具体项目需要使用许多支票实例,而且在我看来,这是一个不合时宜的事情,所以不妨感谢任何想法/解决方案.

下面是一个迷你的例子,我写的只是为了澄清我想要做什么.如果您需要更多信息,请告诉我们

接口:

public interface IRobot {
    String getName();
}

实现:

public class Robocop implements IRobot {
    String name = this.getClass()+this.getClass().getName();
    public Robocop() {}
    public String getName() { return name; }
}

public class T1000 implements IRobot {
    String name = this.getClass()+this.getClass().getName();
    public T1000() {}
    public String getName() { return name; }
}

处理实现的类:

import java.util.LinkedList;
import java.util.List;
public class RobotFactory {

    public static void main(String[] args) {
        new RobotFactory();
    }

    public RobotFactory() {
        List<IRobot> robots = new LinkedList<IRobot>();
        robots.add( new Robocop() );
        robots.add( new T1000() );
        System.out.println("Test 1 - Do not cast,and call deploy(robot)");
        for(IRobot robot : robots) {
            deploy(robot);  // deploy(Object robot) will be called for each..
        }
        System.out.println("Test 2 - use instanceof");
        for(IRobot robot : robots) { // use instanceof,works but can get messy
            if(robot instanceof Robocop) {
                deploy((Robocop)robot);
            }
            if(robot instanceof T1000) {
                deploy((T1000)robot);
            }
        }
        System.out.println("Test 3 - dynamically cast using reflection?");
        for(IRobot robot : robots) {
            //deploy((<Dynamic cast based on robot's type>)robot);  // <-- How to do this?
        }
    }

    public void deploy(Robocop robot) {
        System.out.println("A Robocop has been received... preparing for deployment.");
        // preparing for deployment
    }

    public void deploy(T1000 robot) {
        System.out.println("A T1000 has been received... preparing for deployment.");
        // preparing for deployment
    }

    public void deploy(Object robot) {
        System.out.println("An unkNown robot has been received... Deactivating Robot");
        // deactivate
    }
}

输出

[Robocop@42e816,T1000@9304b1]
Test 1 - Do not cast,and call deploy(robot)
An unkNown robot has been received... Deactivating Robot
An unkNown robot has been received... Deactivating Robot
Test 2 - use instanceof
A Robocop has been received... preparing for deployment.
A T1000 has been received... preparing for deployment.
Test 3 - dynamically cast using reflection?

所以,总结一下我的问题,在这种情况下我怎么能完全避免使用instanceof.谢谢.

解决方法

您可以部署IRobot的方法,或使用 visitor pattern.

不,反思不会让事情变得更容易.

原文地址:https://www.jb51.cc/java/123713.html

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。

相关推荐