@Test
public void testGetterInInterfaceOrSuperHasWiderType() {

    Method readMethod = null;
    readMethod = ObjectPropertyUtils.getReadMethod(ComparableHolderImpl.class, "comparable");
    //System.out.println(readMethod.getReturnType());
    assertEquals(Integer.class, readMethod.getReturnType());
    readMethod = ObjectPropertyUtils.getReadMethod(NumberedImplOne.class, "number");
    //System.out.println(readMethod.getReturnType());
    assertEquals(Integer.class, readMethod.getReturnType());
    readMethod = ObjectPropertyUtils.getReadMethod(ConcreteNarrowedNumberHolder.class, "number");
    //System.out.println(readMethod.getReturnType());
    assertEquals(Integer.class, readMethod.getReturnType());
    readMethod = ObjectPropertyUtils.getReadMethod(ConcreteNarrowedNumberHolderSub.class, "number");
    //System.out.println(readMethod.getReturnType());
    assertEquals(Integer.class, readMethod.getReturnType());
    // This case is *not* covered by our workaround, and would fail w/ JDK 6 on Linux if enabled.
    // The interface has a concrete superclass, which will be returned in JDK6 on Linux where the
    // Method order returned by reflection on a class is different, and the Introspector isn't smart
    // enough to ask which Method return type is more specific.
    for (int i = 0; i < 1; ++i) {
        readMethod = ObjectPropertyUtils.getReadMethod(KualiPercentHolder.class, "decimal");
        //System.out.println(readMethod.getReturnType());
        //System.out.println(readMethod.getReturnType() == KualiDecimal.class);
    }
    if (readMethod.getReturnType() == KualiDecimal.class) {
        LOG.info("I bet you're using JDK6 on Linux");
    }
    //System.out.println("==============================================");
    //System.out.println("ObjectPropertyUtils.getReadMethod(Base.class, \"value\")");
    readMethod = ObjectPropertyUtils.getReadMethod(Base.class, "value");
    //System.out.println(readMethod.getReturnType());
    assertEquals(Number.class, readMethod.getReturnType());
    //System.out.println("==============================================");
    //System.out.println("ObjectPropertyUtils.getReadMethod(Int.class, \"value\")");
    readMethod = ObjectPropertyUtils.getReadMethod(Int.class, "value");
    //System.out.println(readMethod.getReturnType());
    assertEquals(Integer.class, readMethod.getReturnType());
    //        System.out.println("==============================================");
    //        try {
    //            // lookup bean info for given class
    //            BeanInfo info = Introspector.getBeanInfo(Int.class);
    //            if (info != null) {
    //                // get list of descriptors and iterate to validate each property
    //                PropertyDescriptor[] descriptors = info.getPropertyDescriptors();
    //                for (int i = 0; i < descriptors.length; i++) {
    //                    System.out.println("--------------------------");
    //                    PropertyDescriptor descriptor = descriptors [i];
    //                    System.out.println(descriptor.getName());
    //
    //                    // check if read method is bridge and lookup real method
    //                    readMethod = descriptor.getReadMethod();
    //                    System.out.println(readMethod.getReturnType());
    //                    System.out.println("readMethod.isBridge()=>" + readMethod.isBridge());
    //                    if (readMethod != null && readMethod.isBridge()) {
    //                        Method method = Int.class.getMethod(readMethod.getName(), readMethod.getParameterTypes());
    //                        System.out.println(method.getReturnType());
    //
    //                        // if method found, update read method
    //                        // which also updates property type
    //                        if (method != null) {
    //                            descriptor.setReadMethod(method);
    //
    //                            // TODO: lookup write method with same type in case the write
    //                            // method is the bridge method
    //                        }
    //                    }
    //                }
    //            }
    //        } catch (IntrospectionException e) {
    //            e.printStackTrace();  //To change body of catch statement use File | Settings | File Templates.
    //        } catch (NoSuchMethodException e) {
    //            e.printStackTrace();  //To change body of catch statement use File | Settings | File Templates.
    //        }
    // Other cases to test if we have to refine this functionality:
    // * similar to the ConcreteNarrowedNumberHolder,
    //   but creating an abstract impl of AbstractKualiDecimalHolder as the intermediate class
    // * similar to ConcreteNarrowedNumberHolderSub, but ConcreteNarrowedKualiDecimalHolderSub
}