Java 泛型 - 不在范围内
Java generics - not within bounds
我有以下示例无法编译并生成 Error:() java: type argument GroupOfPartsDecorImpl<V> is not within bounds of type-variable GOP
。代码如下:
class MainContainerGroupPartDecorator<V, GOP extends GroupOfParts<V, PartDecorator<V, ? extends Part<V>>>>
extends BaseContainerGroupPartDecorator<V, GOP> {
public static <V> MainContainerGroupPartDecorator<V, GroupOfPartsDecorImpl<V>> getInstance() {
return null;
}
}
class BaseContainerGroupPartDecorator<V, GOP extends GroupOfParts<V, ?>> {
void something() {}
}
class GroupOfPartsDecorImpl<V> implements GroupOfParts<V, PartDecorator<V, PartImpl1<V>>> {
@Override
public Collection<PartDecorator<V, PartImpl1<V>>> getParts() {
return null;
}
}
interface GroupOfParts<V, P extends Part<V>> {
Collection<P> getParts();
}
class PartDecorator<V, P extends Part<V>> implements Part<V> {
@Override
public V getId() {
return null;
}
}
class PartImpl1<V> implements Part<V> {
@Override
public V getId() {
return null;
}
}
既然 GOP 是 GOP extends GroupOfParts<V, PartDecorator<V, ? extends Part<V>>>
而 GroupOfPartsDecorImpl 应该在最后 GroupOfParts<V, PartDecorator<V, Part<V>>
为什么会出现这个错误?
问题是您在第 2 个泛型 ? extends Part<V>
的第 3 层中的有界通配符。您可以通过额外的通用 P
来指定它
class MainContainerGroupPartDecorator<V, P extends Part<V>, GOP extends GroupOfParts<V, PartDecorator<V, P>>>
extends BaseContainerGroupPartDecorator<V, GOP>
{
public static <V> MainContainerGroupPartDecorator<V,PartImpl1<V>, GroupOfPartsDecorImpl<V>> getInstance() {
return null;
}
}
GroupOfParts
的第二个通用参数必须是 PartDecorator<V, ? extends Part<V>>
。并且由于泛型在默认情况下是不变的,因此不能偏离这一点。但是GroupOfPartsDecorImpl
用的是PartDecorator<V, PartImpl1<V>>
,不一样,所以编译不过
您可以通过在 MainContainerGroupPartDecorator
的声明中使第二个参数协变来解决此问题:
class MainContainerGroupPartDecorator<V, GOP extends GroupOfParts<V,
? extends PartDecorator<V, ? extends Part<V>>>>
extends BaseContainerGroupPartDecorator<V, GOP> {
(基本上把PartDecorator<V, ? extends Part<V>>
改成了? extends PartDecorator<V, ? extends Part<V>>
)
我有以下示例无法编译并生成 Error:() java: type argument GroupOfPartsDecorImpl<V> is not within bounds of type-variable GOP
。代码如下:
class MainContainerGroupPartDecorator<V, GOP extends GroupOfParts<V, PartDecorator<V, ? extends Part<V>>>>
extends BaseContainerGroupPartDecorator<V, GOP> {
public static <V> MainContainerGroupPartDecorator<V, GroupOfPartsDecorImpl<V>> getInstance() {
return null;
}
}
class BaseContainerGroupPartDecorator<V, GOP extends GroupOfParts<V, ?>> {
void something() {}
}
class GroupOfPartsDecorImpl<V> implements GroupOfParts<V, PartDecorator<V, PartImpl1<V>>> {
@Override
public Collection<PartDecorator<V, PartImpl1<V>>> getParts() {
return null;
}
}
interface GroupOfParts<V, P extends Part<V>> {
Collection<P> getParts();
}
class PartDecorator<V, P extends Part<V>> implements Part<V> {
@Override
public V getId() {
return null;
}
}
class PartImpl1<V> implements Part<V> {
@Override
public V getId() {
return null;
}
}
既然 GOP 是 GOP extends GroupOfParts<V, PartDecorator<V, ? extends Part<V>>>
而 GroupOfPartsDecorImpl 应该在最后 GroupOfParts<V, PartDecorator<V, Part<V>>
为什么会出现这个错误?
问题是您在第 2 个泛型 ? extends Part<V>
的第 3 层中的有界通配符。您可以通过额外的通用 P
class MainContainerGroupPartDecorator<V, P extends Part<V>, GOP extends GroupOfParts<V, PartDecorator<V, P>>>
extends BaseContainerGroupPartDecorator<V, GOP>
{
public static <V> MainContainerGroupPartDecorator<V,PartImpl1<V>, GroupOfPartsDecorImpl<V>> getInstance() {
return null;
}
}
GroupOfParts
的第二个通用参数必须是 PartDecorator<V, ? extends Part<V>>
。并且由于泛型在默认情况下是不变的,因此不能偏离这一点。但是GroupOfPartsDecorImpl
用的是PartDecorator<V, PartImpl1<V>>
,不一样,所以编译不过
您可以通过在 MainContainerGroupPartDecorator
的声明中使第二个参数协变来解决此问题:
class MainContainerGroupPartDecorator<V, GOP extends GroupOfParts<V,
? extends PartDecorator<V, ? extends Part<V>>>>
extends BaseContainerGroupPartDecorator<V, GOP> {
(基本上把PartDecorator<V, ? extends Part<V>>
改成了? extends PartDecorator<V, ? extends Part<V>>
)