Хабр Курсы для всех
РЕКЛАМА
Практикум, Хекслет, SkyPro, авторские курсы — собрали всех и попросили скидки. Осталось выбрать!
A obj = new A()
{
@Override
public void someOverridenMethod()
{
...
}
};obj.getClass() нам вообще класс замыкания вернёт. И тогда надо дёргать getEnclosingClass()enum E {
first,
second {
public String toString() {
return "not first";
}
}
}
E.first.getClass().isEnum() вернет true;E.second.getClass().isEnum() вернет false!enum E {
first,
second {
public String toString() {
return "not first";
}
};
static class Helper { }
public static final Helper helper = new Helper();
}
E.second.getClass().getEnclosingClass().isEnum() вернет true;E.helper.getClass().getEnclosingClass().isEnum() вернет true.obj.getClass().isEnum() — неправильно.obj instanceof Enum.a.class;
.getClass() — это даже не шаг назад, а какой-то прыжок со скалы вниз.Class<?> getClass(), а на самом деле там не совсем такой дженерик?Class<String> cls = String.class.Class<? extends String> cls = "".getClass(); (а на самом деле можно).иначе бы #getClass() нельзя было заоверрайдить при наследовании
И компилятор проверяет именно такую сигнатуру, потому что String к Object апкастится отлично.
Class<?>, напримерpublic class Foo {
public Class<?> getClass1() { return getClass(); }
}
Foo foo = new Foo();
Class<? extends Foo> cls1 = foo.getClass();
Class<? extends Foo> cls2 = foo.getClass1();
/** * return The actual result type is String. */ public static <?> getSomething() { return "Hello World"; }
Class<A> result1 = a.getClass(); , а в том почему компилируется Class<? extends A> result = a.getClass();Если обычная ссылка на класс может быть связана с любым объектом Class, параметризованная ссылка может связываться только с объектами типа, указанного при объявлении.
Class<A> result1 = a.getClass(); //error
Class<? extends A> result = a.getClass();//ok
Параметризация в Java реализуется с применением стирания (erasure).
class A{}
class B{}
List<A> aList = new ArrayList<A>();
List<B> bList = new ArrayList<B>();
System.out.println(aList.getClass().equals(bList.getClass() ) );
trueThe actual result type is Class<? extends |X|> where |X| is the erasure of the static type of the expression on which getClass is called.
class SomeObject{
public void someMeth(){
System.out.println("Hello");
}
}
class Controller<T>{
private T mObj = null;
public Controller(T obj){
mObj = obj;
}
public void control(){
mObj.someMeth();// <---- compilation error!
}
}
public class Parameterising {
public static void main(String [] args){
SomeObject someObj = new SomeObject();
Controller<SomeObject> controller = new Controller<SomeObject>(someObj);
controller.control();
}
}Информация о параметрах типов недоступна внутри параметризованного кодаотрабатывает и в методе Object.getClass(). И только ограничения параметра типа
class Controller<T extends SomeObject>{...}
могут спасти ситуацию Controller<Object> controller = new Controller<Object>(new Object());
А знаете ли Вы, что возвращает .getClass()?