java模板泛型类型

时间:2015-05-22 00:07:12

标签: java c++ generics

我是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版本的构造函数中的参数)。

谢谢。

2 个答案:

答案 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应该只是一个成员变量。
  • Java数组和泛型不能很好地混合。大多数情况下,最好使用ArrayList
  • 正如 https://docs.oracle.com/javase/tutorial/java/generics/types.html所述:

      

    按照惯例,类型参数名称是单个大写字母。这与您已经知道的变量命名约定形成鲜明对比,并且有充分的理由:没有这个约定,它将是难以区分类型变量和普通类或接口名称。

  •   
  有了这一切,你的班级就变成了:

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);