是否有可能同时和一般地将有界泛型类和通用接口子类化?

时间:2010-03-02 00:24:58

标签: java generics inheritance subclass extends

我正在尝试通过继承另一个泛型类(带有绑定)并实现通用接口(没有绑定)来创建一个新类:

public class Foo1<T extends Bar> {
    ...
}

public interface Foo2<T> {
    ...
}

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

这给了我编译错误。我也尝试过:

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> {
    ...
}

但这些都不起作用。

以一种允许我保持输入通用的方式定义我的子类的正确语法是什么,让我将它们的类型传递给超类和接口?这甚至可能吗?

谢谢!

4 个答案:

答案 0 :(得分:2)

此声明应该可以正常工作。你得到什么错误?你使用什么编译器?

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

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

答案 1 :(得分:1)

根据您发布的代码,您只有Foo类而不是Foo1类。这是什么原因?或只是发布 - 编辑错误?

我认为这应该有用

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

答案 2 :(得分:1)

这不会给JDK 1.6.0_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> {}

答案 3 :(得分:0)

这(来自你的问题):

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> {
    ...
}

也就是说,在扩展Foo1时不应重述边界。

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