Re: generic constructor call with concret type
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