【问题标题】:How to retrieve implementing class/interface of parent interface?如何检索父接口的实现类/接口?
【发布时间】:2016-09-30 00:42:42
【问题描述】:

我很清楚 oop 的多态性和继承概念,但是我处于需要知道实现类的情况。例如:

public CommonReadRepository<?> getReadRepository(String tableName) {
        if (tableName == null)
            return null;
        switch (tableName) {
        case "order":
            return orderRepository;
        ...
        }
        return null;
    }

接口orderRepository扩展了CommonReadRepository,由于我的需求,我需要访问orderRepository中定义的一个函数。

CommonReadRepository<?> repository=getReadRepository("order");

有什么方法可以检查CommonReadRepository的实现(子)类或接口吗?

当然,我总是可以这样做:

if(tableName=="order")
return (OrderRepository)CommonReadRepository<?>;

我尝试调试 getReadRepository("order"),但它给了我一个 JdkDynamicAopProxy 的实例,我不确定它是如何工作的。

if(interface is instanceof xyz class) 我不想使用它,因为我有 100 个课程,我想保留它作为最后的手段......或者换句话说 我不知道xyz课

谢谢

【问题讨论】:

  • 我不太确定你在问什么...你不能使用instanceofgetClass() 吗?
  • 如果您需要访问该方法,您应该使用包含它的参数类型。这听起来像是一个设计问题。

标签: java spring oop


【解决方案1】:

以下是检查返回的 Object 是否为指定类的实例的一种方法:

CommonReadRepository<?> repository=getReadRepository("order"); if(repository instanceof WhatEverSubclass) { // do something }

但是使用这种方法并不是 OOP 应该采用的方式。如果你的类都实现了同一个接口,为什么不定义一个通用方法,然后在所有子类中使用,但每次实现都不一样。

【讨论】:

  • 接口可以有一个实现类必须提供的自标识符。
【解决方案2】:

我认为,你试图做的并不是让你到任何地方。

您可以使用反射工具 (https://github.com/ronmamo/reflections) 找到所有继承接口的可用类。我将它用于依赖注入器,它非常可靠。

但是,为什么不直接使用 instanceof 运算符来确保对象的类型正确:

if( repository instanceof OrderRepository) return (OrderRepository)repository;

但是,这不会改变你的函数的返回类型,你需要在你的函数之外再次检查返回值的类型。

更新:如果数百个对象发生这种情况,您可以更改 getRepository 方法以返回您作为参数提供的类型:&lt;T&gt; getRepository(String name, Class&lt;T&gt; expectedType)

这将允许您OrderRepository o = getRepository("order", OrderRepository.class);

【讨论】:

  • 我不能使用 instanceof,我有 100 多个类,最后使用 instanceof 进行检查
猜你喜欢
  • 1970-01-01
  • 2021-09-14
  • 2015-05-12
  • 2016-06-20
  • 1970-01-01
  • 2017-10-21
  • 1970-01-01
  • 2021-07-20
  • 2018-06-29
相关资源
最近更新 更多