gpt4 book ai didi

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

转载 作者:搜寻专家 更新时间:2023-10-31 20:03:15 25 4
gpt4 key购买 nike

编译以下代码:

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/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com