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