首先让我为这个糟糕的标题道歉,但是我不知道如何用一个句子来概括这个标题。
public class GenericFun {
public class TypedStream<I extends OutputStream> {
I input;
public I getInput() { return input; }
public void setInput(I input) { this.input = input; }
}
public abstract class GarbageWriter<I extends OutputStream> {
public void writeGarbage(I output) throws Exception {
output.write("Garbage".getBytes());
}
}
public class GarbageWriterExecutor<I extends OutputStream> extends GarbageWriter<I> {
public void writeTrash(TypedStream stream) throws Exception{
this.writeGarbage(stream.getInput()); // Error
this.writeGarbage((I)stream.getInput()); // OK
}
}
}
在上面的代码中,方法第一行中的类
GarbageWriterExecutor
类中的代码(OutputStream仅是示例)导致编译错误,而第二行则不会。我对此有两个问题。stream.getInput()
扩展了TypedStream.I
,为什么OutputStream
也会导致错误? 最佳答案
TypedStream stream
将禁用通用类型检查,因此编译器仅知道getInput()
将返回一个对象,因此会出错。
请尝试writeTrash(TypedStream<I> stream)
。
也许您可能想要使用writeTrash(TypedStream<? extends I> stream)
以便能够传递为TypedStream
或I
的子类参数化的任何I
。
另一个选择是
public class GarbageWriterExecutor extends GarbageWriter<OutputStream> {
public void writeTrash(TypedStream<?> stream) throws Exception{
this.writeGarbage(stream.getInput());
}
}
要么
public class GarbageWriterExecutor extends GarbageWriter<OutputStream> {
public void writeTrash(TypedStream<? extends OutputStream> stream) throws Exception{
this.writeGarbage(stream.getInput());
}
}