当您使用不同的类型参数实例化通用类型时,两个实例都不兼容。泛型类型的不同实例化不是类型等效的,即从另一个类继承的类与该类的类型等效,即使类型参数本身可以通过继承关联。泛型和多态是两个独立的语言功能。
您的代码等效于以下内容:
// 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();}


