При изучении обобщений Java мне было интересно, возможно ли объявить метод, который получает два аргумента, первый из которых имеет универсальный тип T, а второй - универсальный тип S, который расширяется (или является тем же введите as) T. Поэтому я начал экспериментировать с этим и написал следующее объявление метода:
public static <T, S extends T> void testMethod(T t, S s)
{
System.out.println("We are inside testMethod.");
}
и затем я вызвал этот метод двумя способами следующим образом:
java.lang.Integer num1 = new java.lang.Integer(0);
java.lang.Integer num2 = new java.lang.Integer(1);
testMethod(num1, num2);
testMethod(num1, new Object());
ожидание, что второй вызов вызовет исключение времени компиляции. Но программа была скомпилирована и запущена без ошибок. Затем я изменил объявление метода testMethod
следующим образом:
public <T extends java.lang.Number, S extends T> void testMethod(T t, S s)
со следующими звонками:
testMethod(new Integer(0), new Double(1.1));
testMethod(new Integer(0), new Object());
Первый вызов не содержит ошибок, но второй вызывает ошибку во время компиляции. Кажется, что, пока t
и s
являются подтипами java.lang.Number
, ошибки не возникает, является ли s
подтипом t
или нет.
Мой вопрос: как мы можем объявить метод, который получает два аргумента, один из которых гарантированно является подтипом другого?