4

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

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

4 回答 4

2

这个声明应该可以正常工作。你得到什么错误?你用的是什么编译器?

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

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

于 2010-03-02T00:32:38.213 回答
1

从您发布的代码中,您只有类 Foo 而不是 Foo1。是这个原因吗?还是只是发布编辑错误?

我认为这应该有效

public class ProblemClass<T extends Bar, U> 
        extends Foo1<T> implements Foo2<U> {
    ...
}
于 2010-03-02T00:33:39.747 回答
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> {}
于 2010-03-02T00:36:34.297 回答
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”不同?

于 2010-03-02T01:21:57.883 回答