以下代码编译:
import java.util.ArrayList;
public class ClassTest
{
private ArrayList<Class<? extends Interface1>> testClass =
new ArrayList<Class<? extends Interface1>>();
private interface Interface1 {}
}
Run Code Online (Sandbox Code Playgroud)
但是以下代码会产生六个错误:
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 {}
}
Run Code Online (Sandbox Code Playgroud)
错误:
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>>();
^
Run Code Online (Sandbox Code Playgroud)
很明显,编译器没有认识到&用于多个通用边界Class.你不允许在type参数上使用多个边界Class吗?那我该怎么做,如果我想要一个ArrayList的Class实现都ES Interface1和Interface2?
动机:我目前正在处理的代码有很多这样的声明:
private static HashMap<String, Class<? extends ApproximativeMode>> approximativeMethod =
new HashMap<String, Class<? extends ApproximativeMode>>();
Run Code Online (Sandbox Code Playgroud)
它们将字符串映射到包含用于执行特定计算的"方法"的类.每个单独的散列映射对类使用不同的通配符(因此ApproximativeMode可能会替换ExactMode为包含所有精确方法的散列映射).
我刚刚完成了所有方法,使它们实现了一个新的接口,NamedMethod它有一个方法可以获得完整的显示名称(例如"线性羟基腺嘌呤方法").我现在想要将所有的hashmaps放入一个,ArrayList这样我就可以编写一个遍历hashmaps并显示其全名的迭代器.所以我最终可能会:
近似方法
冯阿森等人.
欧文等人.
等等
确切的方法
Santalucia等.
LHM
等等
等等
所以我ArrayList持有所有哈希图的声明是:
private ArrayList<Hashmap<String, Class<? extends NamedMethod>>> namedMethods;
Run Code Online (Sandbox Code Playgroud)
当然,没有一个哈希图实际上是那种类型的,但我希望我可以添加NamedMethod到每个中的通配符并获得ArrayList它们全部.显然这是不可能的.
如果不清楚,请告诉我,我会解决它.
通配符边界与类型参数边界:
因此,根据第一个区别,如果您想要多个边界,那么您必须使用与您的类声明的类型参数.这意味着,您必须使类本身通用.接口应该作为顶级接口单独声明:
public class ClassTest<T extends Interface1 & Interface2> {
private ArrayList<Class<T>> testClass = new ArrayList<Class<T>>();
}
interface Interface1 {}
interface Interface2 {}
Run Code Online (Sandbox Code Playgroud)
| 归档时间: |
|
| 查看次数: |
517 次 |
| 最近记录: |