Java模板泛型类型

java template generic type

本文关键字:泛型类型 Java      更新时间:2023-10-16

我是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数组和泛型不能很好地混合在一起。大多数情况下,您最好使用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);