gpt4 book ai didi

java - 为什么不能重载泛型边界?

转载 作者:行者123 更新时间:2023-11-30 08:22:59 24 4
gpt4 key购买 nike

我有点难以理解“新类型”变量不允许在泛型中进行编译的想法,特别是在使用已经有界的变量重载方法方面:

public class Schema {

private interface Stringable {
public String s();
}

public static <T extends Enum<T> & Stringable> String getName(T inst) {
return Schema.getName(inst.getClass()); // error
}

public static <T extends Enum<T> & Stringable> String getName(Class<T> clazz) {
return clazz.getName().toLowerCase();
}

}

编译错误:

Schema.java:[46,21] error: no suitable method found for getName(Class<CAP#1>)

我的主要问题是,为什么不能在相同的通用边界下再次应用彼此适当界定的事物?

最佳答案

当我将您的代码复制/粘贴到 Eclipse 中时,出现了不同的错误:

The method getName(T) in the type Schema is not applicable for the arguments (Class<capture#1-of ? extends Enum>)

经过进一步调查,这似乎不是一个过载问题。其实这有点违反直觉,因为inst.getClass()实际上不是 getName(Class<T extends Enum<T> & Stringable> clazz) 的正确类型.

这似乎是由于您不能为泛型类中的泛型类型设置多个边界。换句话说,您期望的类型 inst.getClass()返回:

Class<? extends Enum<T> & Stringable>

不是实际返回的内容。

为什么?

因为您无法参数化具有多个边界的对象。

基于 this问题,这似乎是Java的限制;部分原因是 Java 不支持使这成为可能的正确语法。那么 inst.getClass() 实际返回了什么?是:

Class<? extends Enum<T>>

而且绝对不符合 getName(Class<T extends Enum<T> & Stringable> clazz) 的范围正如您定义的那样。

不幸的是,快速谷歌搜索并没有给出一个真正的充分理由,所以我不能像我想的那样完整地回答你的问题。但我希望这至少可以解释您的代码发生了什么。

关于java - 为什么不能重载泛型边界?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/23985484/

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