docs: @SuppressWarnings("unchecked")
      private void setupProperties(PropertyDescriptor[] propertyDescriptors) {
          if (theCachedClass.isInterface) {
              LinkedList<CachedClass> superClasses = new LinkedList<CachedClass>();
              superClasses.add(ReflectionCache.OBJECT_CLASS);
              Set interfaces = theCachedClass.getInterfaces();
  
              LinkedList<CachedClass> superInterfaces = new LinkedList<CachedClass>(interfaces);
              // sort interfaces so that we may ensure a deterministic behaviour in case of
              // ambiguous fields (class implementing two interfaces using the same field)
              if (superInterfaces.size()>1) {
                  Collections.sort(superInterfaces, CACHED_CLASS_NAME_COMPARATOR);
              }
  
              SingleKeyHashMap iPropertyIndex = classPropertyIndex.getNotNull(theCachedClass);
              for (CachedClass iclass : superInterfaces) {
                  SingleKeyHashMap sPropertyIndex = classPropertyIndex.getNotNull(iclass);
                  copyNonPrivateFields(sPropertyIndex, iPropertyIndex);
                  addFields(iclass, iPropertyIndex);
              }
              addFields(theCachedClass, iPropertyIndex);
  
              applyPropertyDescriptors(propertyDescriptors);
              applyStrayPropertyMethods(superClasses, classPropertyIndex, true);
  
              makeStaticPropertyIndex();
          } else {
              LinkedList<CachedClass> superClasses = getSuperClasses();
              LinkedList<CachedClass> interfaces = new LinkedList<CachedClass>(theCachedClass.getInterfaces());
              // sort interfaces so that we may ensure a deterministic behaviour in case of
              // ambiguous fields (class implementing two interfaces using the same field)
              if (interfaces.size()>1) {
                  Collections.sort(interfaces, CACHED_CLASS_NAME_COMPARATOR);
              }
  
              // if this an Array, then add the special read-only "length" property
              if (theCachedClass.isArray) {
                  SingleKeyHashMap map = new SingleKeyHashMap();
                  map.put("length", arrayLengthProperty);
                  classPropertyIndex.put(theCachedClass, map);
              }
  
              inheritStaticInterfaceFields(superClasses, new LinkedHashSet(interfaces));
              inheritFields(superClasses);
  
              applyPropertyDescriptors(propertyDescriptors);
  
              applyStrayPropertyMethods(superClasses, classPropertyIndex, true);
              applyStrayPropertyMethods(superClasses, classPropertyIndexForSuper, false);
  
              copyClassPropertyIndexForSuper(classPropertyIndexForSuper);
              makeStaticPropertyIndex();
          }
      }