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

前端之家收集整理的这篇文章主要介绍了Java – 从接口到实现的动态类转换前端之家小编觉得挺不错的,现在分享给大家,也给大家做个参考。
我已经阅读了其他相关的帖子,但仍然不太清楚如何,或者是否可以在 Java中动态地(实现的接口).我的印象是我必须用反思去做.

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

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

接口:

  1. public interface IRobot {
  2. String getName();
  3. }

实现:

  1. public class RoboCop implements IRobot {
  2. String name = this.getClass()+this.getClass().getName();
  3. public RoboCop() {}
  4. public String getName() { return name; }
  5. }
  6.  
  7. public class T1000 implements IRobot {
  8. String name = this.getClass()+this.getClass().getName();
  9. public T1000() {}
  10. public String getName() { return name; }
  11. }

处理实现的类:

  1. import java.util.LinkedList;
  2. import java.util.List;
  3. public class RobotFactory {
  4.  
  5. public static void main(String[] args) {
  6. new RobotFactory();
  7. }
  8.  
  9. public RobotFactory() {
  10. List<IRobot> robots = new LinkedList<IRobot>();
  11. robots.add( new RoboCop() );
  12. robots.add( new T1000() );
  13. System.out.println("Test 1 - Do not cast,and call deploy(robot)");
  14. for(IRobot robot : robots) {
  15. deploy(robot); // deploy(Object robot) will be called for each..
  16. }
  17. System.out.println("Test 2 - use instanceof");
  18. for(IRobot robot : robots) { // use instanceof,works but can get messy
  19. if(robot instanceof RoboCop) {
  20. deploy((RoboCop)robot);
  21. }
  22. if(robot instanceof T1000) {
  23. deploy((T1000)robot);
  24. }
  25. }
  26. System.out.println("Test 3 - dynamically cast using reflection?");
  27. for(IRobot robot : robots) {
  28. //deploy((<Dynamic cast based on robot's type>)robot); // <-- How to do this?
  29. }
  30. }
  31.  
  32. public void deploy(RoboCop robot) {
  33. System.out.println("A RoboCop has been received... preparing for deployment.");
  34. // preparing for deployment
  35. }
  36.  
  37. public void deploy(T1000 robot) {
  38. System.out.println("A T1000 has been received... preparing for deployment.");
  39. // preparing for deployment
  40. }
  41.  
  42. public void deploy(Object robot) {
  43. System.out.println("An unknown robot has been received... Deactivating Robot");
  44. // deactivate
  45. }
  46. }

输出

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

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

解决方法

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

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

猜你在找的Java相关文章