Java 为什么可以';泛型边界不能重载吗?
我很难理解“新类型”变量不允许在泛型中编译的想法,特别是在用已经有界的变量重载方法方面:Java 为什么可以';泛型边界不能重载吗?,java,generics,Java,Generics,我很难理解“新类型”变量不允许在泛型中编译的想法,特别是在用已经有界的变量重载方法方面: public class Schema { private interface Stringable { public String s(); } public static <T extends Enum<T> & Stringable> String getName(T inst) { return Schema
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();
}
}
公共类架构{
私有接口可串接{
公共字符串s();
}
公共静态字符串getName(T inst){
返回Schema.getName(inst.getClass());//错误
}
公共静态字符串getName(类clazz){
返回clazz.getName().toLowerCase();
}
}
编译错误:
Schema.java:[46,21] error: no suitable method found for getName(Class<CAP#1>)
Schema.java:[46,21]错误:找不到适用于getName(类)的方法
我的主要问题是,为什么不能在相同的通用边界下再次应用彼此适当绑定的东西?当我将代码复制/粘贴到Eclipse中时,我遇到了一个不同的错误: 类型
Schema
中的方法getName(T)
不适用于参数(Class
)
经过进一步调查,这似乎不是过载问题。事实上,这有点违反直觉,因为inst.getClass()
实际上不是getName(Class clazz)
的正确类型
这似乎是因为在泛型类中不能为泛型类型设置多个边界。换句话说,您希望inst.getClass()
返回的类型:
Class<? extends Enum<T> & Stringable>
这显然不符合您定义的getName(Class clazz)
的界限
不幸的是,快速的谷歌搜索并不能给出一个很好的理由,所以我不能像我想的那样完整地回答你的问题。但我希望这至少能解释代码中发生了什么。能否在第46行显示调用?java不支持(真正的)泛型。你在找C#)@yshavit第46行是通过上面代码中的
//error
表示的。我非常感谢您对它的澄清,但这基本上是我到目前为止的理解。我的主要问题是为什么Java有这种(明显的)局限性和潜力workarounds@Rogue啊,很抱歉。我误解了你的要求。如果你还没看过的话,这是另一个可以看的地方;它给出了一个非常有趣的分类。我想一个可能的解决办法(但很难看)是制作您自己的类型,这是两种类型的组合,但不幸的是,这在您的情况下不起作用。。。
Class<? extends Enum<T>>