通用类型类型不符合预期

时间:2017-12-15 12:13:26

标签: java generics abstract-class

我有三个abstract class es:

public abstract class Shader

public abstract class ShaderInput

public abstract class ShaderOutput

Shader类的主体非常简单:

    protected Function<ShaderInput, ShaderOutput> shader;

    public Shader(Function<ShaderInput, ShaderOutput> shader){
        this.shader = shader;
    }

    public ShaderOuput render(ShaderInput input){
        return shader.apply(input);
    }

然后我有VertexShader extends Shader

VertexInput extends ShaderInput

以及VertexOutput

extends ShaderOutput

我不明白为什么我的VertexShader课程中的构造函数不能写成如下:

public VertexShader(Function<VertexInput, VertexOutput> vertexShader){
     super(vertexShader);
}

当我按上述方式键入传入的Function时,IDE会抱怨

The constructor Shader(Function<VertexInput,VertexOutput>) is undefined

我认为,因为VertexInput extends ShaderInputVertexOutput extends ShaderOutput这可行,并且能够为代码提供更多可读性。

1 个答案:

答案 0 :(得分:2)

在您的代码中,可以使用任何render来调用ShaderInput,例如类SpecialInput extends ShaderInput,与VertexInput不兼容。

你能做的就是改变你的课程:

public abstract class Shader<T extends ShaderInput, U extends ShaderOutput> {

  protected Function<T, U> shader;

  public Shader(Function<T, U> shader) {
    this.shader = shader;
  }

  public U render(T input) {
    return shader.apply(input);
  }
}

public class VertexShader extends Shader<VertexInput, VertexOutput> {

  public VertexShader(Function<VertexInput, VertexOutput> vertexShader) {
    super(vertexShader);
  }

}

另见: