我是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];
}
.....
.....
}
我收到了错误:
**无法创建Cmpt的通用数组。
nCmpt无法解析为变量。**
任何人都可以帮忙吗?如何在java中使用模板来实现与c ++相同的功能? (我不想在类中定义一个整数变量,并将其用作我java版本的构造函数中的参数)。
谢谢。
答案 0 :(得分:2)
C ++模板与Java泛型Check this out非常不同。由于类型擦除,Java不允许构造通用数组。您可以将数组创建为对象数组,然后转换为Cmpt[]
// we can't pass values as type-parameter in Java
public VectorSpace(int nCmpt){
v = (Cmpt[])new Object[nCmpt];
}
然而,这段代码是狡猾的,您最好避免使用泛型数组并使用List
代替。 Prefer Lists To Arrays
private List<Cmpt> v;
public VectorSpace()
{
v = new ArrayList<Cmpt>();
}
我不建议您通过直接翻译学习Java或任何语言。选择一本书或在线教程,并自学语言。
答案 1 :(得分:0)
C ++模板不能直接转换为Java泛型:
nCmpt
应该只是一个成员变量。 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);