Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/360.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 为什么可以';泛型边界不能重载吗?_Java_Generics - Fatal编程技术网

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>>