Я использую SWIG для экспорта класса c ++ в Java, но столкнулся с проблемой, пытаясь заставить прокси-объект реализовать интерфейс.
Я изучил документацию SWIG и обнаружил, что вы можете использовать "% pragma (java) jniclassinterfaces = x", чтобы класс JNI реализовал данный интерфейс, и использовать "% pragma (java) moduleinterfaces = x", чтобымодуль реализует любой данный интерфейс, но не имеет соответствующей прагмы для фактического прокси-объекта.
Я бы предпочел, чтобы SWIG генерировал код «реализует X», поскольку попытка добавить эту реализацию позже оказывается трудной.Например, если я пытаюсь создать подкласс SWIG-прокси и затем реализовать интерфейс, я сталкиваюсь с проблемами, потому что я также использую дженерики:
interface IVector<VectorType> {
VectorType add(VectorType other);
...
}
Так что-то подобное терпит неудачу:
class MyVector extends MyProxyVector implements IVector<MyVector> {
MyVector add(MyVector other) {
return (MyVector) super.add(other);
}
}
, потому что это потребует приведения родителя к дочернему классу.
Единственный другой способ обойти эту проблему - это создать класс-обертку или использовать конструктор копирования.Оба они кажутся неэффективными, поскольку их цель - реализовать один интерфейс.