2010-03-02 28 views
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> { 
    ... 
} 

但是这些都没有工作。

什么是正确的语法来定义我的子类的方式,让我保持键入泛型,让我把他们的类型传递给超类和接口?这甚至有可能吗?

谢谢!

+0

编译器错误? – 2010-03-02 00:28:52

+2

我对这个用例感兴趣。 – 2010-03-02 00:32:05

+1

你的意思是'ProblemClass'对于'T'都具有相同的类型吗?如果你在'Foo1'和'Foo2'中有“匹配”方法,这将是必要的。 – 2010-03-02 00:39:58

回答

2

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

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

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

+0

我正在使用IntelliJ IDEA 9,在这种情况下的错误是: 类型参数'T'不在其范围内;应该实施第 – Pinkerton 2010-03-02 01:09:39

+0

号+1对于第一个想法错误提示 – 2010-03-02 07:20:07

1

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

我认为这应该工作

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

对不起,我在编辑格式化问题时必须意外地将'Foo1'改为'Foo'。原来的问题包含'Foo1'。 – 2010-03-02 00:35:20

+0

我刚刚测试过它,它为我编译。@Pinkerton,如果这不能为你编译,请发布错误消息。 – 2010-03-02 00:40:05

+0

@Joe我看到的错误(在IntelliJ IDEA 9中)是: 类型参数'T'不在其范围内;应该执行“Bar” – Pinkerton 2010-03-02 01:13:21

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> {} 
+0

由于某种原因,IntelliJ IDEA 9抱怨: 类型参数'T'不在其范围内;应该实现'Bar' – Pinkerton 2010-03-02 01:10:37

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”不是同一个“Bar”?

+0

是的,我想我可能在IDEA中发现了一个bug。我尝试过的简化案例在您提出的语法中工作得很好。 – Pinkerton 2010-03-02 01:28:13