是否可以根据 int 值创建 Java 泛型 class?

Is possible to create Java generics class depending on int value?

我们可以像这样在 Java 中创建一个通用 class

public class MyClass<T> {
...

但是,现在我正在将一个(非常大的)C++ 代码翻译成 Java,我需要一个 class 与其他代码不同,具体取决于它的大小,就像在这个 C++ 代码中一样:

template<size_t size> class MyClass {
...

所以每个class都是不同的类型,有static个成员是不同的,像“compare”这样的成员只能用于size相同的对象。

可以在 Java 中执行此操作吗?如果没有,你会如何处理?

不,您不能在 Java 中使用值代替泛型作为参数。您可能应该只将大小作为构造函数中的参数,并在考虑大小的情况下实施安全检查。

当然可以,但是很烂。

您可以使用递归类型链对“计数”建模。Inc<Inc<Inc<Integer>> 可以表示 3。

非常尴尬

Java 泛型不是 C++ 模板。 Java 泛型有一个通用的基础实现,并自动编写一些包装代码来转换参数化参数 to/from 一个瘦包装器中的通用基础。

C++ 模板生成不同的类型。

C++ 模板的设计旨在取代代码生成 and/or 手工编写的 C 代码低级数据结构。目标是模板 class 可以匹配甚至超过手写的 C 版本(超过是因为您可以在单个模板上投入更多的工程工作,并在 100 个点中重复使用它)。

std::function 这样的模板更接近 Java 泛型。虽然实现方式不同,但这里它将无数类型转换为一个接口,对最终用户隐藏了转换。在 C++ 中,这种技术称为类型擦除,其中标准函数“擦除”有关存储的可调用对象的所有信息,除了它公开的信息。 C++类型擦除不需要公共基class; Java 确实如此。

但是因为Java泛型支持一种类型擦除,而C++模板不仅支持更多种类的类型擦除,而且还支持完全不同的元编程技术与 Java 不同,用 Java 泛型替换模板将始终 运行 出现问题。只有当 C++ 用例恰好与较弱的 Java 泛型完全一致时,它才能正常工作。

(请注意,虽然较弱,Java 泛型使类型擦除变得容易得多,因为它们为您编写了一堆转换代码,并对其进行了类型检查。较弱并不意味着更糟;它通常意味着更安全。但是机械地用较弱的系统替换系统通常注定要失败。)