2016-05-31 73 views
0

我很清楚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的情况下,我不知道它是如何工作的。

如果(接口的instanceof XYZ类) 我不想使用它,因为我有类100,我想保持它作为最后的手段...或者换句话说 我不知道XYZ类

感谢

+0

我真的不知道你是什么'请问......你不能使用'''instanceof'''或'''getClass()'''? –

+4

如果您需要访问该方法,则应使用包含它的参数类型。这听起来像是一个设计问题。 – chrylis

回答

1

以下是一个方法来检查,如果返回的对象是指定类的一个实例:

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

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

+0

接口可以具有实现类必须提供的自标识符。 – Grayson

0

我想,你试图做的是不让你到达任何地方。

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

然而,你为什么不只是使用instanceof运算符,以确保该对象是正确的类型:

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

但尽管如此,这不会改变你的功能,你的返回类型需要在函数之外再次检查返回值的类型。

更新:如果这种情况发生了上百个对象,你可以改变getRepository方法返回你给的参数类型:<T> getRepository(String name, Class<T> expectedType)

这将让你OrderRepository o = getRepository("order", OrderRepository.class);

+0

我不能使用instanceof,我有100多个类,并用instanceof检查它是最后的手段 – Roxy