0
我對包含使用泛型的成員的類有些麻煩。考慮下面的示例類:上限制泛型的問題
class BaseRequest {
// Content goes here
}
class SubRequest extends BaseRequest {
// IFace methods go here, etc.
}
// Simple datastructure interface
interface Structure<T> {
List<T> getElementsList();
Collection<T> getDependencies(T t);
}
// Simple structure implementation, details unimportant
class StructureImpl<T> implements Structure<T> {
@Override
public List<T> getElementsList() {
// Implementation details not important
return null;
}
@Override
public Collection<T> getDependencies(T t) {
// implementation details not important
return null;
}
}
然後我有一個使用結構
class StructureUsingObject {
final Structure<BaseRequest> structure;
public StructureUsingObject(Structure<BaseRequest> structure) {
this.structure = structure;
}
public void foo() {
for (BaseRequest request : structure.getElementsList()) {
Collection<BaseRequest> requests = this.structure.getDependencies(request);
// do things
}
}
}
通過自身下面的類,這是不行的;
public void foo() {
StructureImpl<BaseRequest> baseImpl = new StructureImpl<BaseRequest>();
StructureUsingObject baseStruct = new StructureUsingObject(baseImpl);
StructureImpl<SubRequest> subImpl = new StructureImpl<SubRequest>();
// Compile error on this line
StructureUsingObject subStruct = new StructureUsingObject(subImpl);
}
這很有道理; StructureImpl <BaseRequest>未執行StructureImpl <SubRequest>的子類。因此,我嘗試修改StructureUsingObject以使用通配符:
class StructureUsingObject {
final Structure<? extends BaseRequest> structure;
public StructureUsingObject(Structure<? extends BaseRequest> structure) {
this.structure = structure;
}
public void foo() {
for (BaseRequest request : structure.getElementsList()) {
// Compile error on this line
Collection<BaseRequest> requests = this.structure.getDependencies(request);
// To clarify, a compile error would happen here as well; the issue isn't with the return type
this.structure.getDependencies(request);
// do things
}
}
}
這也行不通;
The method getDependencies(capture#4-of ? extends BaseRequest) in the type Structure<capture#4-of ? extends BaseRequest> is not applicable for the arguments (BaseRequest)
OK,這是有道理的太多,雖然自動完成提示不(它指出getDependencies應該有(空T)作爲參數)。我不確定該從哪裏出發。我不能在foreach中使用通配符。我如何滿足這樣的要求,即我的StructureUsingObject可以接受具有BaseRequest子類的Structures,但同時也可以使用列表中的元素調用getDependencies?
謝謝,這正是我正在尋找的! – vol