【发布时间】:2012-03-24 19:22:32
【问题描述】:
我有一个关于泛型的问题。 我有以下接口:
public interface InterfaceA<B extends InterfaceA.InterfaceB> {
public interface InterfaceB<A extends InterfaceA> {
void setA(A a);
}
}
以及下面InterfaceA的抽象实现:
public abstract class AImplOne<B extends InterfaceA.InterfaceB> implements InterfaceA<B> {
private final B b;
public AImplOne(B b) {
this.b = b;
b.setA(this); // <-- Unchecked call...
}
}
我很清楚,b.setA(this) 调用未被选中 - 但我不喜欢它,所以我尝试了第二个抽象实现:
public abstract class AImplTwo<A extends InterfaceA, B extends InterfaceA.InterfaceB<A>> implements InterfaceA<B> {
private final B b;
public AImplTwo(B b) {
this.b = b;
b.setA((A)this); // <-- Unchecked cast
}
}
再一次,我很清楚,调用b.setA((A)this) 是一个未选中的演员。
但是应该如何实现或重新设计以摆脱未经检查的代码呢?
【问题讨论】:
-
在一个关于泛型的问题中使用一个字母的类名
A非常非常令人困惑 -
除了使用嵌套类,
AImpl应该是AImplOne或AImplTwo,问题名称中有错字,你没有B的类型参数(这里:B<TA extends A*<???>*>。这可能是个问题,但您的示例代码有点过于复杂。 -
@artbristol:好点:将
A重命名为InterfaceA和B重命名为InterfaceB
标签: java generics interface abstract-class