import java.util.*; import java.util.function.*; import java.util.stream.Stream; public class IllegalAccessErrorTest { public static void main(String[] args) { AllTests allTests = new AllTests(() -> Arrays.asList(new Object()).stream()); SpliteratorsTestData testedSpliterators = allTests.getTestedSpliterators(); SpliteratorTestData testData = testedSpliterators.spliteratorCreator.apply(Arrays.asList(new Object())); testData.createSpliterator(); } static class AllTests { final Supplier> streamSupplier; AllTests(Supplier> streamSupplier) { this.streamSupplier = streamSupplier; } public SpliteratorsTestData getTestedSpliterators() { return new SpliteratorsTestData<>( /// Here's the problem elements -> new SpliteratorTestData<>(streamSupplier.get()::spliterator) ); } } static public class SpliteratorsTestData { private final Function, SpliteratorTestData> spliteratorCreator; public SpliteratorsTestData(Function, SpliteratorTestData> spliteratorCreator) { this.spliteratorCreator = spliteratorCreator; } } static public class SpliteratorTestData { private Supplier> spliteratorCreator; public SpliteratorTestData(Supplier> spliteratorCreator) { this.spliteratorCreator = spliteratorCreator; } public Spliterator createSpliterator() { return spliteratorCreator.get(); } } }