Рассмотрим следующие два класса:Почему невозможно использовать примитивные типы с полиморфными типами возврата?
public interface Foo<T>
{
public T moo();
}
public class IntFoo implements Foo<Integer>
{
public int moo()
{
return 0;
}
}
Этот код выдаст ошибку в public
int
moo
, говоря, что int
несовместима с перекрытых метода обратного типа Integer
. Строго говоря, это верно, поскольку int
не напрямуюInteger
. Тем не менее, мы все знаем, что они могут быть неявно преобразованы друг в друга с использованием автоматического (un) бокса. Что менее знают тот факт, что компилятор генерирует метод моста в этом примере:
public class IntFoo implements Foo<Integer>
{
public <synthetic> <bridge> Object moo()
{
return this.moo(); // upcast
}
public Integer moo() {
return 0;
}
}
Это должно быть сделано, потому что JVM различает типы возвращаемого при разрешении методов, а так как стертое возвращение типа Foo.moo
является Object
, компилятор сгенерировал мостовой метод с той же сигнатурой, что и метод.
Я задаюсь вопросом, почему это не будет работать с примитивными полиморфных типов возврата, а также:
public class IntFoo implements Foo<Integer>
{
public <synthetic> <bridge> Object moo()
{
return Integer.valueOf(this.moo());
}
public int moo()
{
return 0;
}
}
Там, кажется, не будет какой-либо причине не имеют этой функции:
IntFoo intFoo = new IntFoo();
Foo<Integer> foo = intFoo;
Integer i = foo.moo(); // calls the synthetic method, which boxes the result of the actual implementation
Фактически, этот скриншот сеанса REPL показывает, что я даже смог реализовать это в своем custom programming language (который скомпилирован до байт-кода Java):
Приятно знать о методе синтаксического моста, который был для меня новым. – Mifeet