The following Java method fails to compile:
void foo(T t)
{
Class extends T> klass = t.getClass();
}
Error received is:
Type mismatch: cannot convert from Class to Class extends T>
Can someone explain why Class extends T> is invalid, but Class extends Number> is fine?
The actual result type is Class extends |X|> where |X| is the erasure of the static type of the expression on which getClass is called. For example, no cast is required in this code fragment:
Number n = 0;
Class extends Number> c = n.getClass();
解决方案
Because the T class' type doesn't extend from T. Instead, it extends from Number, exactly as you have declared yourself in . Simple as that.
A better question would be:
Why doesn't the following compile?
void foo(T t)
{
Class class1 = t.getClass();
}
The answer to that is that the Object#getClass() returns Class> with an unbounded wildcard ? because the object itself is not directly aware about its generic type which is been expected in an arbitrary method.