Groups | Search | Server Info | Keyboard shortcuts | Login | Register [http] [https] [nntp] [nntps]


Groups > comp.lang.java.programmer > #8580

Re: generic constructor call with concret type

From Robert Klemme <shortcutter@googlemail.com>
Newsgroups comp.lang.java.programmer
Subject Re: generic constructor call with concret type
Date 2011-10-05 22:14 +0200
Message-ID <9f3s4iFrcmU1@mid.individual.net> (permalink)
References <j6h246$uhn$1@online.de> <0dba7690-f51d-4b1f-bd59-92463784de71@20g2000yqq.googlegroups.com> <j6h9o9$4np$1@online.de>

Show all headers | View raw


On 10/05/2011 11:58 AM, Philipp Kraus wrote:
> On 2011-10-05 11:22:50 +0200, Robert Klemme said:
>
>> @SuppressWarnings("unchecked")
>> public Run(Class<? extends T> cl) {
>> if (cl == Float.class) {
>> helper = (Inner<T>) new DoFloat();
>> } else if (cl == Double.class) {
>> helper = (Inner<T>) new DoDouble();
>> } else {
>> throw new IllegalArgumentException("Invalid type: " + cl);
>> }
>> }
>>
>> @Override
>> public T doSomething() {
>> return helper.doAnother();
>> }
>>
>> // Test
>> public static void main(String[] args) {
>> final Base<Double> rd = new Run<Double>(Double.class);
>> final Base<Float> rf = new Run<Float>(Float.class);
>> System.out.println("Double: " + rd.doSomething());
>> System.out.println("Float: " + rf.doSomething());
>>
>> final Base<Integer> ri = new Run<Integer>(Integer.class);
>> System.out.println("Integer: " + ri.doSomething());
>>
>> // final Base<Integer> wontCompile = new Run<Integer>(Double.class);
>> }
>> }
>
> so I need a parameter for the type
>
>> Btw, what do you need that for?
>
> See my posting some days ago. I use a JNI call with C++ templates so I
> must set the template
> parameter on compile-time. Within the JNI call I can't determine the
> generic argument of the
> instantiated java object (because it is set on java-compile-time). So I
> create dual JNI calls one
> for float and one for double, but I must decide on the java ctor call if
> I instantiate the float or double
> object, you do this in the with if(cl == Float.Class), in my source code
> the DoFloat is the JNI call
> for the C++ template float (otherwise the double).

A simpler solution would be

public abstract class Base<T extends Number> {
   public static Base<Double> createDoubleHandler() { return new 
RunDouble(); }
   public static Base<Float> createFloatHandler() { ... }

   public T anylogic(T x) {
     //
     return x == null ? null : specific(x);
   }

   protected abstract T specific(T abc);
}

final class RunDouble extends Base<Double> {
   protected Double specific(Double x) {
     return 123d + x;
   }
}
...

Kind regards

	robert

Back to comp.lang.java.programmer | Previous | NextPrevious in thread | Find similar


Thread

generic constructor call with concret type Philipp Kraus <philipp.kraus@flashpixx.de> - 2011-10-05 09:48 +0200
  Re: generic constructor call with concret type Robert Klemme <shortcutter@googlemail.com> - 2011-10-05 02:22 -0700
    Re: generic constructor call with concret type Philipp Kraus <philipp.kraus@flashpixx.de> - 2011-10-05 11:58 +0200
      Re: generic constructor call with concret type Robert Klemme <shortcutter@googlemail.com> - 2011-10-05 22:14 +0200

csiph-web