以下代码编译:
import java.util.ArrayList;
public class ClassTest
{
private ArrayList<Class<? extends Interface1>> testClass =
new ArrayList<Class<? extends Interface1>>();
private interface Interface1 {}
}
但是下面的代码会产生六个错误:
import java.util.ArrayList;
public class ClassTest
{
private ArrayList<Class<? extends Interface1 & Interface2>> testClass =
new ArrayList<Class<? extends Interface1 & Interface2>>();
private interface Interface1 {}
private interface Interface2 {}
}
错误:
ClassTest.java:5: > expected
private ArrayList<Class<? extends Interface1 & Interface2>> testClass =
^
ClassTest.java:5: ';' expected
private ArrayList<Class<? extends Interface1 & Interface2>> testClass =
^
ClassTest.java:5: <identifier> expected
private ArrayList<Class<? extends Interface1 & Interface2>> testClass =
^
ClassTest.java:6: > expected
new ArrayList<Class<? extends Interface1 & Interface2>>();
^
ClassTest.java:6: '(' or '[' expected
new ArrayList<Class<? extends Interface1 & Interface2>>();
^
ClassTest.java:6: illegal start of expression
new ArrayList<Class<? extends Interface1 & Interface2>>();
^
很明显,编译器没有识别出&
用于Class
. 您是否不允许类型参数有多个界限Class
?如果我想要一个同时实现and的ArrayList
of Class
es,我应该怎么做?Interface1
Interface2
动机:我目前正在处理的代码有很多这样的声明:
private static HashMap<String, Class<? extends ApproximativeMode>> approximativeMethod =
new HashMap<String, Class<? extends ApproximativeMode>>();
他们将一个字符串映射到一个包含用于进行特定计算的“方法”的类。每个单独的 hashmap 对类使用不同的通配符(因此ApproximativeMode
可能会替换ExactMode
为包含所有确切方法的 hashmap)。
我刚刚浏览了所有方法,使它们实现了一个新接口,NamedMethod
该接口有一个方法可以获取它们的完整显示名称(例如“线性羟基腺嘌呤方法”)。我现在想将所有的哈希图放入一个ArrayList
,这样我就可以编写一个遍历哈希图并显示它们的全名的迭代器。所以我最终可能会得到:
近似方法
冯阿森等人。
欧文等人。
等等
精确方法
圣卢西亚等人。
LHM
等等
等等
所以我对ArrayList
持有所有哈希图的声明是:
private ArrayList<Hashmap<String, Class<? extends NamedMethod>>> namedMethods;
当然,实际上没有一个哈希映射属于那种类型,但我希望我可以NamedMethod
在每个哈希映射中添加通配符并获得ArrayList
所有哈希映射。显然这是不可能的。
如果不清楚,请告诉我,我会修复它。