Class <v>可以在泛型类型上采用多个边界吗?</v>

时间:2013-10-02 10:49:33

标签: java generics

以下代码编译:

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同时实现Interface2private 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}}个。显然这是不可能的。

如果不清楚,请告诉我,我会解决它。

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 {}