Когда вы создаете экземпляр универсального типа с аргументами разных типов, эти два экземпляра не совместимы по типу.Различные экземпляры универсального типа не эквивалентны типу в том смысле, что класс, который наследуется от другого класса, эквивалентен типу этого класса, даже если сами аргументы типа могут быть связаны наследованием.Универсальность и полиморфизм - это две разные языковые возможности.
Ваш код эквивалентен следующему:
// Java defaults unspecified type arguments to Object.
fileHandler<Object, Object> file;
if (...) {
// Error: fileHandler<String, String> is not equivalent to fileHandler<Object, Object>
file = new fileHandler<String, String>();
} else {
// Error: fileHandler<String, String[]> is not equivalent to fileHandler<Object, Object>
file = new fileHandler<String, String[]>();
}
Если вы действительно хотите изолировать полиморфный интерфейс, который не зависит от типов, используемых для создания экземпляраваш класс fileHandler, тогда я бы предложил вам использовать интерфейс:
interface IFileHandler
{
// If this interface needs to talk about keys and values, it
// does so using only java.lang.Object.
}
public class fileHandler<Key extends Object, Value extends Object>
implements IFileHandler
{
// ...
}
public class A extends fileHandler<String, String>
{
// ...
}
public class B extends fileHandler<String, String[]>
{
// ...
}
IFileHandler file;
if (...) {
file = new A();
} else {
file = new B();
}