docs: public boolean matches(T target) {
          Set<TypeDescription> previous = new HashSet<TypeDescription>();
          for (TypeDefinition typeDefinition : target) {
              if (!previous.add(typeDefinition.asErasure())) { // Main type can be an interface.
                  return false; // Avoids a life-lock when encountering a recursive type-definition.
              } else if (matcher.matches(typeDefinition.asGenericType())) {
                  return true;
              }
              LinkedList<TypeDefinition> interfaceTypes = new LinkedList<TypeDefinition>(typeDefinition.getInterfaces());
              while (!interfaceTypes.isEmpty()) {
                  TypeDefinition interfaceType = interfaceTypes.removeFirst();
                  if (previous.add(interfaceType.asErasure())) {
                      if (matcher.matches(interfaceType.asGenericType())) {
                          return true;
                      } else {
                          interfaceTypes.addAll(interfaceType.getInterfaces());
                      }
                  }
              }
          }
          return false;
      }