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

Joh*_*ers 5 java generics

以下代码编译:

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吗?那我该怎么做,如果我想要一个ArrayListClass实现都ES Interface1Interface2

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

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它们全部.显然这是不可能的.

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

Roh*_*ain 5

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

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

因此,根据第一个区别,如果您想要多个边界,那么您必须使用与您的类声明的类型参数.这意味着,您必须使类本身通用.接口应该作为顶级接口单独声明:

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)