Użycie Guava's ClassPath
Próbuję zainicjować klasy znajdujące się w określonym pakiecie, ale chcę użyć konstruktora do zainicjowania, ponieważ nie propaguje wyjątków. Więc to, co wypracowałem dostać konstruktorów:Cykliczny błąd interfejsu podczas korzystania z orElseThrow
ClassPath.from(classLoader).getTopLevelClasses("test.package").stream()
.map(ClassPath.ClassInfo::load)
.map(Class::getConstructors)
.map(Arrays::stream)
.map(constructorStream -> constructorStream
.filter(constructor -> constructor.getParameterCount() == 0)
.findAny()
.orElseThrow(RuntimeException::new)
);
to jednak daje błąd w InteliJ po prostu stwierdzając cykliczne interfejs. Myślę, że wiem, co to jest interfejs cykliczny, ale nie jestem pewien, dlaczego spowodowałby ten błąd. O ile wiem, tak długo, jak znany jest typ zwracany (który dla orElseThrow
ma wartość zwracaną w tym przypadku jako Constructor<?>
), to wyrzucenie niesprawdzonego wyjątku powinno być w porządku. Jeśli użyję orElse(null)
, błąd zniknie. Co tu się dzieje i jak mogę rzucić wyjątek RuntimeException, który chcę rzucić?
Co się stanie, jeśli przedrostek 'orElseThrow' zostanie podany w określonym typie? '. orElseThrow (RuntimeException :: new)' –
RealSkeptic
Błąd został usunięty i teraz działa zgodnie z przeznaczeniem. Dlaczego jednak? Czy "X" nie powinien już być zdefiniowany przez podany wyjątek? – danthonywalker
Zgaduję, że korzystasz z kompilatora, który nie wykonuje bardzo ścisłego wnioskowania typu. W środowisku Eclipse działa bez jawnego argumentu typu. W 'javac' firmy Oracle skarży się na niezgłoszony wyjątek. – RealSkeptic