Java 有可能同时对有界泛型类和泛型接口进行泛型子类化吗?

Java 有可能同时对有界泛型类和泛型接口进行泛型子类化吗?,java,generics,inheritance,subclass,extends,Java,Generics,Inheritance,Subclass,Extends,我试图通过子类化另一个泛型类(有一个绑定)并实现一个泛型接口(没有绑定)来创建一个新类: 公共类Foo1{ ... } 公共接口2{ ... } 公共课问题 扩展Foo1实现Foo2{ ... } 这给了我编译错误。我还尝试: public class ProblemClass<T, U> extends Foo1<T extends Bar> implements Foo2<U> { ... } public class Pro

我试图通过子类化另一个泛型类(有一个绑定)并实现一个泛型接口(没有绑定)来创建一个新类:

公共类Foo1{
...
}
公共接口2{
...
}
公共课问题
扩展Foo1实现Foo2{
...
}
这给了我编译错误。我还尝试:

public class ProblemClass<T, U> 
        extends Foo1<T extends Bar> implements Foo2<U> {
    ...
}

public class ProblemClass<T extends Bar, U> 
        extends Foo1<T> implements Foo2<U> {
    ...
}
公共类问题类
扩展Foo1实现Foo2{
...
}
公共课问题
扩展Foo1实现Foo2{
...
}
但这两种方法都不管用

用什么正确的语法来定义我的子类,让我保持键入的泛型,让我将它们的类型传递给超类和接口?这可能吗


谢谢

这个声明应该很有效。你有什么错误?你在用什么编译器

class ProblemClass<T extends Bar, U>
  extends Foo1<T>
  implements Foo2<U>
{
  ...
}
类问题类
扩展Foo1
实现Foo2
{
...
}


这是有效的Java。如果IDEA的编译器拒绝了它,IntelliJ就有一个bug。

从您发布的代码来看,您只有类Foo而不是Foo1。这就是原因吗?或者只是发布编辑错误

我认为这应该行得通

public class ProblemClass<T extends Bar, U> 
        extends Foo1<T> implements Foo2<U> {
    ...
}
公共类问题类
扩展Foo1实现Foo2{
...
}

这不会给JDK 1.6.0\u 07带来编译错误

public class Bar {}

public class Foo1<T extends Bar> {}

public interface Foo2<T> {}

public class ProblemClass<T extends Bar, U> extends Foo1<T> implements Foo2<U> {}
公共类栏{}
公共类Foo1{}
公共接口Foo2{}
公共类ProblemClass扩展Foo1实现Foo2{}
这(来自您的问题):

公共类问题类
扩展Foo1实现Foo2{
...
}
应该是这样的:

public class ProblemClass<T extends Bar, U> 
        extends Foo1<T> implements Foo2<U> {
    ...
}
公共类问题类
扩展Foo1实现Foo2{
...
}
也就是说,在扩展Foo1时不应该重述边界


通过这种修正,代码在javac中编译得很好。如果IntelliJ IDEA仍然拒绝编译它,那么您可能发现了一个bug,或者您在Foo.java中引用的“Bar”与ProblemClass.java中的“Bar”不同?

我对这个用例很感兴趣。您是说
ProblemClass
对这两个
T
具有相同的类型吗?如果在
Foo1
Foo2
中有“匹配”方法,这将是必要的。Tom,不,它们将是离散类型,我扩展的类和我实现的接口用于不同的目的。有趣的是,我无法按照ahmadabdolkader的建议简化代码来重现错误。如果我这样做,它编译得很好。我现在想知道IDEA是否对继承链上的某个更高级的东西有点古怪,尽管我无法想象为什么会这样。对不起,我一定是在编辑格式化问题时意外地将
Foo1
更改为
Foo
。原始问题包含
Foo1
。我刚刚测试了这个问题,并为我编译了它@平克顿,如果这不能为您编译,请发布错误消息。@Joe我看到的错误(在IntelliJ IDEA 9中)是:类型参数“t”不在其范围内;如果实现'Bar',我正在使用IntelliJ IDEA 9,这种情况下的错误是:类型参数'T'不在它的范围内;由于某种原因,IntelliJ IDEA 9抱怨:类型参数“T”不在其范围内;应该实现“Bar”是的,我想我可能在这个想法中发现了一个bug。我尝试过的简化案例与您提出的语法非常吻合。
public class ProblemClass<T extends Bar, U> 
        extends Foo1<T extends Bar> implements Foo2<U> {
    ...
}
public class ProblemClass<T extends Bar, U> 
        extends Foo1<T> implements Foo2<U> {
    ...
}