编译以下代码:
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
的类型参数是否不允许有多个边界?如果我想要一个实现了 Interface1
和 Interface2
的 Class
的 ArrayList
,我该怎么办?
动机:我目前正在处理的代码有很多这样的声明:
private static HashMap<String, Class<? extends ApproximativeMode>> approximativeMethod =
new HashMap<String, Class<? extends ApproximativeMode>>();
它们将一个字符串映射到一个包含进行特定计算的“方法”的类。每个单独的 hashmap 对类使用不同的通配符(因此对于包含所有确切方法的 hashmap,ApproximativeMode
可能会替换为 ExactMode
)。
我刚刚介绍了所有方法,让它们实现了一个新接口(interface) NamedMethod
,它有一个方法可以获取完整的显示名称(例如“线性羟基腺嘌呤方法”)。我现在想将所有散列映射放入 ArrayList
中,这样我就可以编写一个遍历散列映射并显示其全名的迭代器。所以我可能会得到:
近似方法
冯·阿森等人
欧文等人
等等
精确方法
桑塔卢西亚等人。
左手
等等
等等
所以我对包含所有 HashMap 的 ArrayList
的声明是:
private ArrayList<Hashmap<String, Class<? extends NamedMethod>>> namedMethods;
当然,没有一个 hashmap 实际上是那种类型的,但我希望我可以将 NamedMethod
添加到每个 hashmap 的通配符中,并得到一个 ArrayList
商场。显然这是不可能的。
如果不清楚,请告诉我,我会解决。
最佳答案
通配符边界与类型参数边界:
- 通配符不能有多个界限。您只能将它们用于类型参数。
- 另一个区别是,通配符可以有上限和下限,但类型参数没有下限。
因此,根据第一个st 区别,如果您想要多个边界,则必须使用类中声明的类型参数。这意味着,您必须使类本身成为通用类。然后接口(interface)应该单独声明为顶级接口(interface):
public class ClassTest<T extends Interface1 & Interface2> {
private ArrayList<Class<T>> testClass = new ArrayList<Class<T>>();
}
interface Interface1 {}
interface Interface2 {}
关于java - Class<V> 可以对泛型类型进行多重限制吗?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/19135216/