我正在从事一个项目,该项目具有广泛的通用继承和依赖关系树。转到编辑以查看更好的示例。 基础看起来像这样:
class A {
...
}
class B {
...
}
class C extends B {
...
}
class D<T extends B> extends A {
...
}
class StringMap<T extends A> {
HashMap<String, T> _elements;
...
}
所以现在我要编写一个包含特定 StringMap
的类类型。
class X {
StringMap<D<C>> _thing = new StringMap<D<C>>;
...
}
目前一切正常。 D<C>
实际上是一个很长的名称,并且特定组合将在代码的其他部分中非常频繁地出现,所以我决定为特定组合创建一个类,这样它会更清晰并且名称更短。
class DC extends D<C> {
}
//and go to update X
class X {
StringMap<D<C>> _thing = new StringMap<D<C>>(); //still works fine
StringMap<DC> _thing = new StringMap<DC>(); //error
...
}
罢工><罢工>罢工>
Eclipse 给出错误
Bound mismatch: The type
DC
is not a valid substitute for the bounded parameter<T extends A>
of the typeStringMap<T>
所以问题是,为什么这不起作用? DC
除了扩展 D<C>
什么都不做并回应构造函数。为什么 StringMap
见 DC
当它只是它所排除的东西的子类时会有所不同吗?
编辑:
好的,修改示例以更接近我实际做的事情。我测试了它,它确实产生了错误。我在这里做的是使用通用类型来确保 clone()
为沿着继承树实现它的任何人返回正确的类。然后在子类中,我使用 B<T extends B<T>>
确保 B
的子类将 B 的子类作为泛型类型传入 T
.
public abstract class Undoable<T> implements Comparable<T> {
public abstract T clone();
public abstract void updateFields(T modified);
}
abstract public class A<T extends A<T, U>, U extends Comparable<U>>
extends Undoable<T> {
abstract U getKey();
@Override
public int compareTo(T element)
{
return getKey().compareTo(element.getKey());
}
}
public class B<T extends B<T>> extends A<T, String> {
@Override
public T clone()
{
// TODO Auto-generated method stub
return null;
}
@Override
public void updateFields(T modified)
{
// TODO Auto-generated method stub
}
@Override
String getKey()
{
// TODO Auto-generated method stub
return null;
}
}
public class C extends B<C> {
}
public class D<T extends B<T>> extends A<D<T>, String> {
@Override
String getKey()
{
// TODO Auto-generated method stub
return null;
}
@Override
public D<T> clone()
{
// TODO Auto-generated method stub
return null;
}
@Override
public void updateFields(D<T> modified)
{
// TODO Auto-generated method stub
}
}
public class DC extends D<C> {
}
public class StringMap<T extends Undoable<T>> {
HashMap<String, T> _elements;
}
public class Main {
public static void main(String[] args)
{
StringMap<D<C>> _thing = new StringMap<D<C>>(); //works
StringMap<DC> _thing1 = new StringMap<DC>(); //error
//Bound mismatch: The type DC is not a valid substitute for
//the bounded parameter <T extends Undoable<T>> of the type StringMap<T>
}
}
最佳答案
您一定是做错了其他事情,因为以下工作正常:
import java.util.HashMap;
public class Q {
class A {
}
class B {
}
class C extends B {
}
class D<T extends B> extends A {
}
class StringMap<T extends A> {
HashMap<String, T> _elements;
}
class DC extends D<C> {
}
//and go to update X
class X {
StringMap<D<C>> thing1 = new StringMap<D<C>>(); // still works fine
StringMap<DC> thing2 = new StringMap<DC>(); // NO error!!!
}
}
尝试发布这样一个重现您的错误的类。
关于java - 通用限制 hell : Bound Mismatch,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/4751027/