我正在尝试通过继承另一个泛型类(带有绑定)并实现通用接口(没有绑定)来创建一个新类:
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> {
...
}
但这些都不起作用。
以一种允许我保持输入通用的方式定义我的子类的正确语法是什么,让我将它们的类型传递给超类和接口?这甚至可能吗?
谢谢!
答案 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”不同?