final <T> Class<? super T> randomAssignableType(final Class<T> type) {
        List<Class<?>> list = assignableTo.computeIfAbsent(type, new Function<Class<?>, List<Class<?>>>() {
            public List<Class<?>> apply(Class<?> t) {
                return Collections.unmodifiableList(new ArrayList<>(ClassTestUtil.findAllInterfacesAndSuperClasses(type)));
            }
        });
        return (Class<? super T>) RandomSource.current().nextElement(list);
    }