5

以下代码编译:

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的ArrayListof Classes,我应该怎么做?Interface1Interface2

动机:我目前正在处理的代码有很多这样的声明:

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所有哈希映射。显然这是不可能的。

如果不清楚,请告诉我,我会修复它。

4

1 回答 1

5

通配符界限与类型参数界限:

  • 通配符不能有多个界限。您只能将它们用于类型参数。
  • 另一个区别是,通配符可以有上限和下限,但类型参数没有下限。

所以,根据第一个区别,如果你想有多个边界,那么你必须使用你的类声明的类型参数。这意味着,您必须使类本身成为泛型。然后接口应该单独声明为顶级接口:

public class ClassTest<T extends Interface1 & Interface2> {
    private ArrayList<Class<T>> testClass = new ArrayList<Class<T>>();    
}

interface Interface1 {}
interface Interface2 {}
于 2013-10-02T10:52:18.523 回答