设计Java通用层次结构以避免模板类冲突

设计Java通用层次结构以避免模板类冲突,java,generics,inheritance,collections,Java,Generics,Inheritance,Collections,考虑以下rawtype形式的Java通用类层次结构 class A ... class B extends A ... class C extends A ... 使用类a中的方法,并在B和C中重写 String foo() ... String bar(A a) ... T foo() ... 我们可以成功地拨打以下电话 String r = (new B()).foo(); String r = (new B()).bar(new C()); 这里的真正目标是将的实例保存到容器中 不

考虑以下rawtype形式的Java通用类层次结构

class A ...
class B extends A ...
class C extends A ...
使用类a中的方法,并在B和C中重写

String foo() ...
String bar(A a) ...
T foo() ...
我们可以成功地拨打以下电话

String r = (new B()).foo();
String r = (new B()).bar(new C());
这里的真正目标是将的实例保存到容器中 不管我们有哪种类型的

A fred;
List as = new LinkedList();
for (A a : as) ... fred.bar(a); ...
A<String,String,Integer> fred;
List<A<String,String,Integer>> as = new LinkedList<>();
for (A a : as) ... fred.bar(a); ...
类B和C的对象可以构造并毫无问题地传递给foo。 现在我们介绍泛型

class A<T,U,V> ...
class B<T> extends A<T,Void,Object> ...
class C<N> extends A<String,Void,Object> ...
然后我们做出以下合理的决定

String r = (new A<String,Void,Object>()).foo();
String r = (new B<String>()).foo();
String r = (new C<Integer>()).foo();

String r = (new B<String>()).foo();
String r = (new B<String>()).bar(new C<Integer>());
String r=(新的A()).foo();
字符串r=(新的B()).foo();
字符串r=(新的C()).foo();
字符串r=(新的B()).foo();
字符串r=(新的B()).bar(新的C());
这里的真正目标是将的实例保存到容器中 不管我们有哪种类型的

A fred;
List as = new LinkedList();
for (A a : as) ... fred.bar(a); ...
A<String,String,Integer> fred;
List<A<String,String,Integer>> as = new LinkedList<>();
for (A a : as) ... fred.bar(a); ...
A;
列表为=新建LinkedList();
因为。。。弗雷德。巴尔(a)。。。
这些决定使得无法将类型B和C的对象加载到“as”列表中, 由于通用模板中的类型冲突


请注意,这是一个现有的软件,我正试图清除它的警告

如果您只关心
foo()
的返回值,那么您可以使用:

List<A<String, ?, ?>> as = ...;
但是,您将无法调用参数类型为
U
V
A
方法。如果这是一个问题,那么看起来你必须以某种方式重新设计

可能还会看到:


列表作为
无效。列表只有一个类型参数。你的意思是把
列为
?@user7是的,这就是我的意思。我可以给出具体的代码示例,但这里有一个到实际系统的链接和一个示例文件。我发现提供的链接非常有用。