То, что мы имеем здесь, это два разных метода с индивидуальными параметрами типа каждый.
public abstract <T extends AnotherClass> void getAndParse(Args... args);
Это метод с параметром типа с именем T, ограниченный AnotherClass
, что означает, что каждый подтип AnotherClass
допускается в качестве параметра типа.
public <SpecificClass> void getAndParse(Args... args)
Это метод с параметром типа с именем SpecificClass
, ограниченным Object
(то есть каждый тип допускается как параметр типа). Вы действительно этого хотите?
Используется ли параметр типа внутри Args
? Я думаю, что проблема будет там.
Значение
public abstract <T extends AnotherClass> void getAndParse(T... args);
заключается в том, что вызывающий метода может решить, с каким параметром типа он хочет вызвать метод, при условии, что это некоторый подтип AnotherClass
. Это означает, что в действительности метод может быть вызван с любыми объектами типа AnotherClass
.
Поскольку вызывающая сторона может выбрать параметр типа, вы не можете в подклассе сузить тип параметра до SpecificClass
- это будет не реализация метода, а другой метод с тем же именем (перегрузка).
Может быть, вы хотите что-то вроде этого:
public abstract class GetAndParse<T extends AnotherClass> {
public SomeClass var;
public abstract void getAndParse(T... args);
}
public class Implementor extends GetAndParse<SpecificClass> {
// some field declarations
// some method declarations
@Override
public void getAndParse(SpecificClass... args) {
// method body making use of args
}
}
Теперь метод getAndParse
реализует метод родительского класса.