java - Class<V> 可以对泛型类型进行多重限制吗?

标签 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 的类型参数是否不允许有多个边界?如果我想要一个实现了 Interface1Interface2ClassArrayList,我该怎么办?

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

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/

相关文章:

Java 代理 - 无法正确交换来自 HTTP GET/POST 请求的数据

scala - 如何匹配Scala泛型类型?

Java:当项目不相关时有界异构集合

generics - 泛型类、约束和继承

java - 数学难题

java - 在文本文件中查找字符串,删除行和下面的行

java - 线程优先级

java - hibernate 多对多级联不起作用

java - 将 Getters/Setter 添加到一个基类

c# - 使用通用字典和/或使用 IDictionary 排序