Generics 有没有办法绕过Java';s无法将泛型参数转发到非泛型类型? 在C++中,我可以编写这样的代码: class Shader { ... void setUniform(GLuint handle, int value); void setUniform(GLuint handle, float value); void setUniform(GLuint handle, const std::vector<float> &value); ... }; class UniformValueBase { ... GLuint handle; Shader &shader; virtual void apply() = 0; }; template<typename T> class UniformValue: public UniformValueBase { ... T value; virtual void apply() override { shader.setUniform(handle, value); }; 类着色器{ ... void setUniform(GLuint句柄,int值); void setUniform(GLuint句柄、浮点值); void setUniform(GLuint句柄、常量std::向量和值); ... }; 类UniformValueBase{ ... 胶柄; 着色器&着色器; 虚空应用()=0; }; 模板类UniformValue:public UniformValueBase{ ... T值; 虚拟void apply()覆盖{ setUniform(句柄、值); };

Generics 有没有办法绕过Java';s无法将泛型参数转发到非泛型类型? 在C++中,我可以编写这样的代码: class Shader { ... void setUniform(GLuint handle, int value); void setUniform(GLuint handle, float value); void setUniform(GLuint handle, const std::vector<float> &value); ... }; class UniformValueBase { ... GLuint handle; Shader &shader; virtual void apply() = 0; }; template<typename T> class UniformValue: public UniformValueBase { ... T value; virtual void apply() override { shader.setUniform(handle, value); }; 类着色器{ ... void setUniform(GLuint句柄,int值); void setUniform(GLuint句柄、浮点值); void setUniform(GLuint句柄、常量std::向量和值); ... }; 类UniformValueBase{ ... 胶柄; 着色器&着色器; 虚空应用()=0; }; 模板类UniformValue:public UniformValueBase{ ... T值; 虚拟void apply()覆盖{ setUniform(句柄、值); };,generics,kotlin,Generics,Kotlin,当T是在Shader中具有setUniform方法的任何类型,并且如果我尝试使用不受支持的T,它将无法编译,这正是我想要的行为 不幸的是,等价物在Java或Kotlin中不起作用,因为泛型是基于类型擦除的,这意味着UniformValue只使用t作为对象实现一次 我只需要支持大约六种不同的类型,因此使用UniformValueBase的非泛型子类代替泛型是可行的,但是有没有一种优雅且可扩展的习惯用法,或者使用Kotlin没有的特性,或者使用两种语言都能工作的特性?看起来不可能E在java中被擦除

T
是在
Shader
中具有
setUniform
方法的任何类型,并且如果我尝试使用不受支持的
T
,它将无法编译,这正是我想要的行为

不幸的是,等价物在Java或Kotlin中不起作用,因为泛型是基于类型擦除的,这意味着
UniformValue
只使用
t
作为
对象实现一次


我只需要支持大约六种不同的类型,因此使用
UniformValueBase
的非泛型子类代替泛型是可行的,但是有没有一种优雅且可扩展的习惯用法,或者使用Kotlin没有的特性,或者使用两种语言都能工作的特性?

看起来不可能E在java中被擦除,没有模板。

的根本原因不是真正的类型删除:这是因为C++模板在实例化和java之后被类型化检查(Kotlin和大多数其他语言都具有这个特性)。类型检查通用代码本身。因此,您需要一个约束,要求
T
具有静态方法,Kotlin和Java都不支持这些方法。我所知道的唯一一种语言是,它在JVM上不可用。Scala有一个非常好的通用解决方法,称为类型类模式,Kotlin中还不支持它。

可以使用static
setUniform
重载,而必须传入一个类型标记(值的类)。可以在异构映射中保存值(以有效的Java发布)。在Kotlin中,如果您能够应用具体化的类型参数,一些样板文件可能会减少。我从未花时间学习过Java或Kotlin中的反射,但在这里似乎没有什么帮助。Kotlin使用
KClass
而不是
Java.lang.Class
(尽管您可以从前者获得后者),并且
KClass
本身是泛型的。