Я заметил что-то, в то время как я искал дженерики. В приведенном ниже примере 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
. Есть ли конкретная причина, по которой он также избавляется от этого, или это просто общий "давайте просто избавиться от всего, потому что это проще, кто когда-нибудь понадобится" в любом случае?