Allow throwing original checked exception instead of wrapping unchecked exception.
Use case: https://github.com/spring-projects/spring-boot/blob/23fe3977d2d319f9f1bd0101f40dbb639ade7082/spring-boot-project/spring-boot/src/main/java/org/springframework/boot/type/classreading/ConcurrentReferenceCachingMetadataReaderFactory.java#L71-L89
@Override
public MetadataReader getMetadataReader(String className) throws IOException {
MetadataReader metadataReader = this.classNameCache.get(className);
if (metadataReader == null) {
metadataReader = super.getMetadataReader(className);
this.classNameCache.put(className, metadataReader);
}
return metadataReader;
}
@Override
public MetadataReader getMetadataReader(Resource resource) throws IOException {
MetadataReader metadataReader = this.resourceCache.get(resource);
if (metadataReader == null) {
metadataReader = createMetadataReader(resource);
this.resourceCache.put(resource, metadataReader);
}
return metadataReader;
}
can be rewritten to:
@Override
public MetadataReader getMetadataReader(String className) throws IOException {
return this.classNameCache.computeIfAbsent(className,ThrowingFunction.of((ThrowingFunction<String, MetadataReader>)super::getMetadataReader).checked());
}
@Override
public MetadataReader getMetadataReader(Resource resource) throws IOException {
return this.resourceCache.computeIfAbsent(resource,ThrowingFunction.of(this::createMetadataReader).checked());
}
WDYT @philwebb
Comment From: philwebb
Personally, I'm not so keen on the (somewhat) hack that's being used to throw the checked exception from a signature that doesn't expose one.
@SuppressWarnings ("unchecked")
static <E extends Throwable> void throwAsUnchecked(Exception exception) throws E {
throw (E) exception;
}
I think it somewhat goes against the spirit of the design.
Comment From: snicoll
Yeah I agree.
@quaff thanks for the suggestion, in any case.