Я заметил что-то, в то время как я искал дженерики. В приведенном ниже примере doStuff1 компилируется, но doStuff2 не выполняет:
public <T extends Foo> void doStuff1(T value) {
Class<? extends Foo> theClass = value.getClass();
}
public <T extends Foo> void doStuff2(T value) {
Class<? extends T> theClass = value.getClass();
}
Итак, я просмотрел документацию для Object.getClass() и нашел это:
Фактический тип результата - класс <? extends | X | > где | X | это стирание статического типа выражения, на которое вызывается getClass.
Мне было немного любопытно. Почему getClass() разработан таким образом? Я могу понять, как преобразовать типы в свои исходные классы, если это применимо, но я не вижу очевидной причины, по которой они обязательно должны были бы заставить его также убить T. Есть ли конкретная причина, по которой он также избавляется от этого, или это просто общий "давайте просто избавиться от всего, потому что это проще, кто когда-нибудь понадобится" в любом случае?