Path: csiph.com!x330-a1.tempe.blueboxinc.net!usenet.pasdenom.info!weretis.net!feeder1.news.weretis.net!news1.tnib.de!feed.news.tnib.de!news.tnib.de!news.belwue.de!rz.uni-karlsruhe.de!feed.news.schlund.de!schlund.de!news.online.de!not-for-mail From: Philipp Kraus Newsgroups: comp.lang.java.programmer Subject: Re: JNI generic type of jobject Date: Tue, 4 Oct 2011 18:01:23 +0200 Organization: 1&1 Internet AG Lines: 80 Message-ID: References: <4e8afbde$0$2529$e4fe514c@news2.news.xs4all.nl> NNTP-Posting-Host: p3ee2964c.dip0.t-ipconnect.de Mime-Version: 1.0 Content-Type: text/plain; charset=iso-8859-1; format=flowed Content-Transfer-Encoding: 8bit X-Trace: online.de 1317744083 31935 62.226.150.76 (4 Oct 2011 16:01:23 GMT) X-Complaints-To: abuse@einsundeins.com NNTP-Posting-Date: Tue, 4 Oct 2011 16:01:23 +0000 (UTC) User-Agent: Unison/2.1.5 Xref: x330-a1.tempe.blueboxinc.net comp.lang.java.programmer:8529 On 2011-10-04 16:53:22 +0200, Daniel Pitts said: > On 10/4/11 5:28 AM, Silvio wrote: >> On 10/04/2011 02:23 PM, Philipp Kraus wrote: >>> Hello, >>> >>> I use JNI calls for some Java classes. Some Java classes are generic >>> classes like: >>> >>> class mytestclass { >>> >>> public native void mymethod(); >>> >>> } >>> >>> The stub shows: >>> >>> JNIEXPORT void JNICALL Java_mytestclass_mymethod(JNIEnv* p_env, jobject >>> p_object) >>> >>> How can I get from the jobject which object type is the generic >>> parameter T? Because I would >>> like to create different codes if I do something like: >>> >>> mytestclass x = new mytestclass(); >>> x.mymethod(); >>> >>> mytestclass x = new mytestclass(); >>> x.mymethod(); >>> >>> Thanks >>> >>> Phil >>> >>> >> >> No such thing is possible. Generics are a compile time thing. At runtime >> only the raw types are available. >> >> Silvio > > int is not a valid generic type parameter, as int is a primitive and > generic types must by Object types. > > Also, generics are not the same as C++ templates. There isn't > different code created for each concrete usage. Its all exactly the > same code. > > If you are doing different behavior based on the compile time type, > then you need to do a little bit more work to implement the strategy > pattern. > > class MyTestClass { > private MyMethodStrategy strategy; > > public mymethod() { > strategy.mymethod(this); > } > } > > interface MyMethodStrategy { > void mymethod(MyTestClass testClass); > } > > > class MyStringMethodStrategy implement MyMethodStrategy { > public native void mymethod(MyTestClass testClass); > } > > > class MyIntegerMethodStrategy implement MyMethodStrategy { > public native void mymethod(MyTestClass testClass); > } > > > Then you will have two different native methods to implement each strategy. This a very good solution, I implement my own pattern Thanks