以下代码编译:
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
的类型参数有多个边界?如果我想ArrayList
Class
Interface1
同时实现Interface2
和private static HashMap<String, Class<? extends ApproximativeMode>> approximativeMethod =
new HashMap<String, Class<? extends ApproximativeMode>>();
,我该怎么办?
动机:我目前正在处理的代码有很多这样的声明:
ApproximativeMode
它们将字符串映射到一个类,该类包含用于执行特定计算的“方法”。每个单独的散列映射对类使用不同的通配符(因此ExactMode
可能会被包含所有精确方法的散列映射替换为NamedMethod
。
我刚刚完成了所有方法,使它们实现了一个新的接口ArrayList
,它有一个获得完整显示名称的方法(例如“线性羟基腺嘌呤方法”)。我现在想把所有的哈希映射放到ArrayList
中,这样我就可以编写一个遍历哈希映射并显示其全名的迭代器。所以我最终可能会:
近似方法
von Ahsen等人Owen等人
等
精确方法
Santalucia等。
LHM
等
等
所以我保留所有哈希图的private ArrayList<Hashmap<String, Class<? extends NamedMethod>>> namedMethods;
的声明是:
NamedMethod
当然,没有一个哈希图实际上属于那种类型,但我希望我可以在每个哈希映射中添加ArrayList
并获得{{1}}个。显然这是不可能的。
如果不清楚,请告诉我,我会解决它。
答案 0 :(得分:5)
通配符边界与类型参数边界:
因此,根据1 st 的区别,如果你想要多个边界,那么你必须使用你的类声明的类型参数。这意味着,您必须使类本身通用。接口应该作为顶级接口单独声明:
public class ClassTest<T extends Interface1 & Interface2> {
private ArrayList<Class<T>> testClass = new ArrayList<Class<T>>();
}
interface Interface1 {}
interface Interface2 {}