2013-10-02 4 views
3

Прежде всего позвольте мне извиниться за ужасное название, но я понятия не имел, как суммировать это в одном предложении.Передача общих типов как общих параметров метода в Java

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 
     } 
    } 
} 

В приведенном выше коде (OutputStream это просто пример) в классе GarbageWriterExecutor класса в методе первой строке вызывает ошибку компиляции, а второй нет. У меня есть два вопроса по этому поводу.

  1. Почему stream.getInput() вызывает ошибку, даже если TypedStream.I известно продлить OutputStream?
  2. Как я могу решить эту проблему без уродливого литья?

ответ

3

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());  
    } 
} 
4

Поскольку ваш метод

public void writeTrash(TypedStream stream) 

также должны убедиться TypedStream тип определяется, как это:

public void writeTrash(TypedStream<I> stream) 

Edit: Томас ответить на самом деле объяснить, почему поток

TypedStream отключит проверку общего типа и, следовательно, компилятор только знает, что getInput() вернет объект, следовательно, ошибку.

1

Просто используйте:

public class GarbageWriterExecutor<I extends OutputStream> extends GarbageWriter<I> { 
    public void writeTrash(TypedStream<I> stream) throws Exception { 
     this.writeGarbage(stream.getInput()); 
    } 
} 

Т.е. параметризуйте свой параметр TypedStream с помощью I.

0
1.Resolve this by using this code. 

public void writeTrash(TypedStream<I> stream) throws Exception{ 
      this.writeGarbage(stream.getInput());  
      this.writeGarbage(stream.getInput()); 
     } 
2. In Generic class class name is followed by a type parameter section. If you are not doing this then you have to do casting. 
Смежные вопросы