0

在过去的几个小时里,为了插入 Java 和 C++ 代码,我一直在玩弄 CNI。

当我在寻找使用 Java 集合作为我的旧团队缺失的替代品的可能性时libstd,我尝试创建一个java.util.Stack对象并对其进行操作。

然而,编译器(gccgcj,可能相同)似乎在我无辜的头脑中玩他的廉价把戏:

# gcc -g -I. test.cc
test.cc: In function ‘int main(int, char**)’:
test.cc:24:3: error: ‘java::util::Stack’ is not a template
   Stack<Person> *stack = new Stack<Person>();
   ^
test.cc:24:30: error: ‘java::util::Stack’ is not a template
   Stack<Person> *stack = new Stack<Person>();

(Person 对象是定义良好的 java 类)

只有当我删除类型参数规范时,它才让我使用数据结构,就好像类型参数被选择为java.lang.Object. CNI 文档似乎根本没有提及它!确实没有关于模板的话。

有人知道在 CNI 上下文中使用模板吗?支持吗?我搜索googlestackoverflow寻找答案,但找不到丝毫线索。任何帮助将不胜感激。

另外,我想知道我是否使用的是 gcc 2.95.2(那个 gcc 版本有 gcj 吗?)

我正在主机Virtual Boxed Ubunto 12上工作。windows 10更重要的是gcjgcc版本代表4.8.4 java --version产量1.5libgcj 4.8.4

4

1 回答 1

1

不是 CNI 用户,但这样做的原因似乎很明显。

Java 中的通用规范java.util.Stack<T>只是一个编译时间约束,用于检查您是否添加了与 T 兼容的类型的对象。在内部,java.util.Stack只有一个实现接受所有类型的Objects(实际上是对所有类型的对象的引用)。您甚至可以通过使用不安全的转换来欺骗编译器添加不是 T 的实例。所以,java.util.Stack<String>java.util.Stack<Date>内部是一样的。

C++ 是不同的。具有不同参数的相同模板的实例化会创建不同的不兼容类型。例如std::stack<int>std::stack<int*>std::stack<char>是完全不同的实现并且具有不同的代码。C++ 模板机制是 java 泛型的超集。

例如,如果您想在 C++ 中获得 Java 功能,std::stack<void*>即使您想存储某些特定类型 T 的对象,您也会编写。必须手动完成到 T 的类型转换。

CNI 做同样的事情。它实例化了唯一一个java.util.Stack可以接受所有类型对象的实现。

于 2016-05-12T08:47:06.830 回答