java - 通用限制 hell : Bound Mismatch

标签 java generics restriction type-erasure

我正在从事一个项目,该项目具有广泛的通用继承和依赖关系树。转到编辑以查看更好的示例。 基础看起来像这样:

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 type StringMap<T>

所以问题是,为什么这不起作用? DC除了扩展 D<C> 什么都不做并回应构造函数。为什么 StringMapDC当它只是它所排除的东西的子类时会有所不同吗?

编辑:
好的,修改示例以更接近我实际做的事情。我测试了它,它确实产生了错误。我在这里做的是使用通用类型来确保 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/

相关文章:

java - 如何组织具有多个屏幕/面板的基于 MVC 的程序的 Controller ?

ios - 限制删除 UITextField

java 字符串分割函数

c# - 在 ICollection<Tuple<T1,T2>> 上实现 .Contains() 的最简单方法

generics - Kotlin 接口(interface)函数可互换参数

attributes - XSD中同一元素的内容限制和属性验证

objective-c - 使用 NSOpenPanel 限制对某些文件夹的访问

java - 任何人都可以帮助解决 Netbeans 运行 java 代码中的以下问题吗

java - 在 Eclipse 中预览长连接字符串

java - Soap WebService 到 Soap Webservice 调用