Java 泛型:如何在使用super时获得重用的类型?

Java 泛型:如何在使用super时获得重用的类型?,java,generics,Java,Generics,我试图通过方法签名实现类型savety,但是类型关系是下限。我似乎需要使用super T来限制方法参数所受的类型。但是我没有办法将传递的类型传播到方法的输出参数 基本上我想要的是: 类栏{} 福班{ //这很好用 公众食物来源(酒吧){ 返回新的Foo(bar); } //语法不正确! //这应该将当前的Foo转换为仅用于子类的Foo public Foo fooing(Class clazz){/正如前面所指出的,并且您已经经历过的,对于类方法来说,这是不可能的 常见问题解答提供的解决方法是使

我试图通过方法签名实现类型savety,但是类型关系是下限。我似乎需要使用
super T
来限制方法参数所受的类型。但是我没有办法将传递的类型传播到方法的输出参数

基本上我想要的是:

类栏{}
福班{
//这很好用
公众食物来源(酒吧){
返回新的Foo(bar);
}
//语法不正确!
//这应该将当前的Foo转换为仅用于子类的Foo
public Foo fooing(Class clazz){/正如前面所指出的,并且您已经经历过的,对于类方法来说,这是不可能的

常见问题解答提供的解决方法是使用静态方法:

public static <A extends Bar, B extends A> Foo<A> upcast(
        Foo<B> from, Class<A> target) { }
publicstaticfoo上传(
Foo-from,类目标){}

但我只能附和其他评论员的担忧:您正在为自己设置一些严重的维护难题,特别是因为我无法想象这篇文章的实际用例(与常见问题解答示例相反,您只处理
Foo
对象,而不是添加到它).

请用文字说明您试图完成的任务。听起来您好像在尝试重新实现向下转换,即。
to
应该只接受它的所有者所代表的类的子类?在这种情况下:为什么超类应该知道它的子类?@mabi您是正确的。除了不接受超类本身(
Bar
)但是(用你的话来说)超类的表示(
Foo
)需要知道子类的情况。原因是
Foo
应该是向下分级的,而不需要实际的
猜测:
Foo to(Class clazz)
?你的第二个例子仍然失败,但我不明白你为什么想要:
?super Bar2
说“给我一个
Bar2
扩展的类的东西”,这对于
Bar
来说是正确的。另外,请注意关注点,表达它们是值得赞赏的。让我补充一下,这是一个简化的示例,实际项目为该功能提供了一个合理的用例。