我有三个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 ShaderInput
和VertexOutput extends ShaderOutput
这可行,并且能够为代码提供更多可读性。
答案 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);
}
}
另见: