J
John Ersatznom
Here's the code snippets.
@SuppressWarnings("unchecked")
public static <S extends Scalar<S>, D extends Dimension, T extends
Point<S, D, T>> Point<S, D, T> getPoint (S component, D dim) {
if (dim.dimensions == 0) return (Point<S, Zero,
ZeroDimensionalPoint<S>>)ZeroDimensionalPoint.getInstance(component.getScalarClass(),
component.isUndefined());
Compiler claims that it cannot convert Point<S, Zero,
ZeroDimensionalPoint<S>> to Point<S, D, T>.
It should warn that the cast requires unchecked conversion instead.
Changing the cast to (Point<S, D,
T>)ZeroDimensionalPoint.getInstance(foo) causes "Cannot cast from
ZeroDimensionalPoint<S> to Point<S, D, T>" instead of a warning.
Changing it simply to "(Point)" warns of an unnecessary cast. Omitting
the cast however just gives the first error noted above!
The @SuppressWarnings("unchecked") annotation doesn't prevent the
"unnecessary cast" warning.
Of course, if the method is called with a dim whose "dimensions == 0" it
is in fact the case that a ZeroDimensionalPoint<S> will be run-time
compatible with any Point<S, D, T> where S matches up and D is a
dimension class that defines its dimensions to be zero, with T being
ZeroDimensionalPoint<S>...
AFAICT the problem is that D might not actually be Zero, but the base
class Dimension or a different Dimension subclass that happens to have
an instance with a dimension of zero. Since the dimension objects are
just used for run-time dimension-compatibility checking and their
classes, as type parameters, to allow users of my math classes to have
compile-time checking for vector math with compile-time-known numbers of
dimensions, this is annoying. There aren't even ever any run-time uses
of dimension object instances except to extract "dimensions", call
toString, and the like.
Anyone know how to make the compiler ignore the dubious casts?
Huh -- that's odd. I just solved it myself when I tried
Point temp = ZeroDimensionalPoint.getInstance(foo);
return temp;
I then get "unchecked" warning on "return temp;" which @SuppressWarnings
makes go away.
@SuppressWarnings("unchecked")
public static <S extends Scalar<S>, D extends Dimension, T extends
Point<S, D, T>> Point<S, D, T> getPoint (S component, D dim) {
if (dim.dimensions == 0) return (Point<S, Zero,
ZeroDimensionalPoint<S>>)ZeroDimensionalPoint.getInstance(component.getScalarClass(),
component.isUndefined());
Compiler claims that it cannot convert Point<S, Zero,
ZeroDimensionalPoint<S>> to Point<S, D, T>.
It should warn that the cast requires unchecked conversion instead.
Changing the cast to (Point<S, D,
T>)ZeroDimensionalPoint.getInstance(foo) causes "Cannot cast from
ZeroDimensionalPoint<S> to Point<S, D, T>" instead of a warning.
Changing it simply to "(Point)" warns of an unnecessary cast. Omitting
the cast however just gives the first error noted above!
The @SuppressWarnings("unchecked") annotation doesn't prevent the
"unnecessary cast" warning.
Of course, if the method is called with a dim whose "dimensions == 0" it
is in fact the case that a ZeroDimensionalPoint<S> will be run-time
compatible with any Point<S, D, T> where S matches up and D is a
dimension class that defines its dimensions to be zero, with T being
ZeroDimensionalPoint<S>...
AFAICT the problem is that D might not actually be Zero, but the base
class Dimension or a different Dimension subclass that happens to have
an instance with a dimension of zero. Since the dimension objects are
just used for run-time dimension-compatibility checking and their
classes, as type parameters, to allow users of my math classes to have
compile-time checking for vector math with compile-time-known numbers of
dimensions, this is annoying. There aren't even ever any run-time uses
of dimension object instances except to extract "dimensions", call
toString, and the like.
Anyone know how to make the compiler ignore the dubious casts?
Huh -- that's odd. I just solved it myself when I tried
Point temp = ZeroDimensionalPoint.getInstance(foo);
return temp;
I then get "unchecked" warning on "return temp;" which @SuppressWarnings
makes go away.