首先让我为这个糟糕的标题道歉,但是我不知道如何用一个句子来概括这个标题。

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)以便能够传递为TypedStreamI的子类参数化的任何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());
      }
    }
    

    10-06 03:37