Hi I am having problems with Generic Types and warning that I get from IDE. I have class that holds generic type value:
public class Result <OUT>{
private final OUT outputValue;
public OUT getOutputValue() {
return outputValue;
}
}
I have abstract class:
public abstract class CustomSource {
public abstract <T> SourceFunction<T> getSource();
}
and class that extends it:
public class OtherCustomSource extends CustomSource {
@Override
public SourceFunction<Result<MyEvent>> getSource() {
some code
}
}
IDE is giving me warning: unchecked overriding return type requires unchecked conversion. What I am missing?
Advertisement
Answer
public abstract <T> SourceFunction<T> getSource();
This is not the promise you intended to make. This says “for every T
, I promise I can get a source of type SourceFunction<T>
.” Then you came along and subclassed it with
public SourceFunction<Result<MyEvent>> getSource();
Which says “specifically, I can get you a source of type Result<MyEvent>
“, a much weaker promise.
If you intend that getSource
only return one specific type, your generic should be on the CustomSource
class, not the getSource
function.
public abstract class CustomSource<T> {
public abstract SourceFunction<T> getSource();
}
public class OtherCustomSource extends CustomSource<Result<MyEvent>> {
@Override
public SourceFunction<Result<MyEvent>> getSource() {
some code
}
}
Then it makes sense to use OtherCustomSource
as a CustomSource<Result<MyEvent>>
(since it can get a source of type Result<MyEvent>
), but it makes no sense to treat a OtherCustomSource
as a CustomSource<Integer>
, for example.