java - 访问充当上限的通用集合的元素类型

标签 java generics

我想编写一个通用容器类。两个类型参数代表所包含元素的类型,以及一个用于查找元素的键类型。该集合具有一个 get 方法,该方法接受一个键并返回一个元素。因此该类的第一个签名将如下所示:

class MyContainer<E, K> {
  ...
  E get(K k) { ...}
  ...
}

现在我想将 K 限制为类,这些类本身就是我想要用作键的元素的容器。

这些包含键的类是通过实现某个接口(interface)来指定的:

interface ProvidesKeys<E> {...}

然后我有具体的实现,例如

class SomeInts implements ProvidesKeys<Integer> {...}

这意味着 SomeInts 从 Integer 中选择一些可以用作键的元素。

我想像这样使用MyContainer:

MyContainer<String, SomeInts> myContainer = new MyContainer<>();
...
myContainer.get(3);

问题是 3 的类型是 Integer,而不是 SomeInts。所以我最初的 MyContainer 方案不再起作用了。

有没有办法限制 K 以便我可以访问 key 容器的元素类型?

我已经尝试过

class MyContainer<E, K extends ProvidesKeys<K> {....}

和通配符形式,但没有任何东西可以让我访问 key 提供类型的元素类型,所以我可以有一个正确的 E get(X k) {...} 方法!?我是否必须引入第三个类型变量来表示关键元素类型(尽管它隐含在关键容器中)?

最佳答案

Do I have to introduce a third type variable to represent the key element type (although it is implicit in the key container)?

是的。你做。除了将其作为参数之外,没有其他方法可以访问该类型。

关于java - 访问充当上限的通用集合的元素类型,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/59038014/

相关文章:

java - 使用值对 ArrayList<HashMap<String, String>> 进行排序

java - 电子表格决策可以被打破吗?

c# - 创建参数化通用对象的实例,并将所有参数设置为 null

c# - 类型 'T' 必须可转换才能将其用作泛型类型或方法中的参数 'T'

java - 为什么我不能从使用泛型创建的类中调用方法? java

c# - 使用其他人共有的方法实现通用 C# 类

java - java 中的网络客户端

java - 用于在字符串中用引号引起来时删除逗号的正则表达式

c# - 从字典返回通用类型(否则返回默认通用值)

java - 验证时间戳格式 yyyy-MM-dd'T'HH :mm:ssZ in java?