2011-03-29 73 views
4

我正在使用SWIG將C++類導出到Java,但遇到了一個問題,試圖強制代理對象實現一個接口。無法弄清楚如何使SWIG/Java強制代理類來實現接口

我搜索了SWIG文檔,發現可以使用「%pragma(java)jniclassinterfaces = x」讓JNI類實現給定的接口,並使用「%pragma(java)moduleinterfaces = x」實現任何給定的接口,但實際代理對象沒有對應的編譯指示。

我希望讓SWIG生成'implements X'代碼,因爲稍後嘗試添加該實現將變得困難。例如,如果我嘗試子類痛飲代理,然後實現接口,我遇到的問題,因爲我還使用泛型:

interface IVector<VectorType> { 
    VectorType add(VectorType other); 
    ... 
} 

因此,像這樣失敗:

class MyVector extends MyProxyVector implements IVector<MyVector> { 
    MyVector add(MyVector other) { 
     return (MyVector) super.add(other); 
    } 
} 

因爲它需要將父母轉換爲子類。

我可以拿出解決這個問題的唯一方法是創建一個包裝類或使用複製構造函數。這兩者似乎都沒有效率,因爲它們實現一個接口的全部目的。

回答

6

這應該通過typemaps mechanism來處理。 下面的代碼:

%module test 

%typemap(javainterfaces) Foo "SomeInterface" 
%typemap(javabase) Foo "SomeBase" 

struct Foo { 
}; 

設置基地和接口Foo,像這樣:

public class Foo extends SomeBase implements SomeInterface { 

//... 
中生成的Java代理類