Java模板泛型类型
java template generic type
我是java新手。但是我经常使用c++。我有一个用c++写的课程。现在我需要用java重写这个类。我对泛型类型感到困惑。
我的c++类是这样的://Form, Cmpt are of class type. nCmpt is a integer
template <class Form, class Cmpt, int nCmpt>
class VectorSpace
{
public:
//component array
Cmpt v[nCmpt];
//constructors
VectorSpace();
VectorSpace(const VectorSpace<Form,Cmpt,nCmpt>& m_v);
.....
.....
};
我试着用java重写它,我遇到了问题:
public class VectorSpace<Form, Cmpt, nCmpt>
{
public Cmpt v[];
public VectorSpace()
{
v = new Cmpt[nCmpt];
}
.....
.....
}
I got errors:
**不能创建通用的Cmpt数组。
nCmpt不能解析为变量。**
有人能帮我吗?我如何在java中使用模板来实现与c++相同的功能?(我不想在类中定义一个整数变量,并在我的java版本的构造函数中使用它作为参数)。
谢谢。
c++模板与Java泛型非常不同。由于类型擦除,Java不允许构造泛型数组。您可以将数组创建为对象数组,然后将其转换为Cmpt[]
// we can't pass values as type-parameter in Java
public VectorSpace(int nCmpt){
v = (Cmpt[])new Object[nCmpt];
}
然而,这段代码是危险的,你最好避免使用泛型数组,而使用List
。列表优于数组
private List<Cmpt> v;
public VectorSpace()
{
v = new ArrayList<Cmpt>();
}
我不建议你通过直接翻译来学习Java或任何语言。选择一本书或在线教程,自学这门语言。
c++模板不能直接转换为Java泛型:
-
nCmpt
应该只是一个成员变量。 Java数组和泛型不能很好地混合在一起。大多数情况下,您最好使用 - 如https://docs.oracle.com/javase/tutorial/java/generics/types.html所言:
按照约定,类型参数名是单个大写字母。这与您已经知道的变量命名约定形成鲜明对比,并且有很好的理由:如果没有这个约定,将很难区分类型变量与普通类或接口名称之间的区别。
ArrayList
。class VectorSpace<F, C> {
private final List<C> v;
private final int nCmpt;
public VectorSpace(int nCmpt) {
this.nCmpt = nCmpt;
this.v = new ArrayList<>(nCmpt);
}
}
VectorSpace<String, Integer> vc = new VectorSpace<>(3);
相关文章:
- 使用泛型类型推送到堆栈时出现问题
- 如何在容器中指定模板化别名的泛型类型
- 具有模板专用化的泛型类型转换
- C++存储泛型 T 类型类的向量
- 如何在C++中返回没有模板的泛型类型?
- 如何在带有约束 (C++) 的函数中使用泛型类型
- 模板函数重载(泛型类型与模板模板类型)选择正确的重载
- 泛型类型别名,它们彼此不兼容
- 泛型类型转换
- 重载泛型类型的模板类时检查运算符=时的自赋值
- 在C++中,如何根据类中的参数返回不同的泛型类型
- C++错误 C2227:'->looseHealth'左侧必须指向类/结构/联合/泛型类型
- 使用泛型类型显式实例化函数模板
- 函数模板中的无效转换错误,返回值取决于其泛型类型
- 如何确保 "<<" 运算符适用于模板化 ADT 定义中的任何泛型类型?
- 仅当泛型类型的值是指针时,才删除该值
- 错误c++visual studio c2227左侧'->;Init';必须指向类/结构/联合/泛型类型
- 用于泛型类型上的泛型操作的SFINAE
- Java泛型类型比较
- Java模板泛型类型