У меня есть класс Generic Class Factory, у которого есть два метода: один использует универсальное значение T класса, а другой использует только собственные определения общих методов.
public class GenericClassFactory<T extends ClassMatchable> {
public <E, K> E newObject(ClassMatcher<E, K> matcher, K key, String packageName){...}
public <K> T newObject(K key, String packageName){...}
}
Метод, который использует универсальный T, работает нормально, но когда я хочу использовать другой метод, который не заботится о том, что является универсальным T, он не будет использовать Generic E, он просто возвратит Object, а затем наберите его.
Data data = new GenericClassFactory().newObject(new ClassMatcher<Data, String>(){...}, "key1", "my.package.name.impl");
Это приводит к ошибкам компиляции, потому что он хочет, чтобы я ввел его (Data). Если я передам GenericClassFactory действительный класс Generic, он будет работать. Это похоже на то, что он не распознает обобщенные методы, если у вас есть определенный обобщенный класс, но он не используется.
Data data = new GenericClassFactory<ClassMatchable>().newObject(new ClassMatcher<Data, String>(){...}, "key1", "my.package.name.impl");
Это отлично работает. Но глупо, что мне нужно было бы определять родовой класс таким образом, когда он не нужен для моих целей. Я мог бы сделать это:
public class GenericClassFactory {
public <E, K> E newObject(ClassMatcher<E, K> matcher, K key, String packageName){...}
public <T extends ClassMatchable, K> T newObject(K key, String packageName){...}
}
Но теперь мой второй метод кажется слишком широким или что-то в этом роде ... возможно, нет. Я имею в виду, что он все равно выдаст ошибку компиляции, если объект, который вы назначаете для возвращаемого типа, не реализует ClassMatchable. Это путь, которым я должен идти? Чтобы мне не приходилось печатать?