Java 如何在非泛型方法中指定两个通配符在语义上相等?

Java 如何在非泛型方法中指定两个通配符在语义上相等?,java,generics,Java,Generics,我目前正在尝试学习拖放教程 遗憾的是,示例代码并不特别关心没有警告,而我更希望自己的代码是干净的 我希望在以下上下文中从该页面实现importData方法: class Base; class Wrapper<T extends Base>; class SelectionList<T extends Base> extends JList<Wrapper<T>>; 毫不奇怪 我一直在尝试几种方法来解决这个问题;(请注意,对于变量o,我已经解决了

我目前正在尝试学习拖放教程

遗憾的是,示例代码并不特别关心没有警告,而我更希望自己的代码是干净的

我希望在以下上下文中从该页面实现importData方法:

class Base;
class Wrapper<T extends Base>;
class SelectionList<T extends Base> extends JList<Wrapper<T>>;
毫不奇怪

我一直在尝试几种方法来解决这个问题;(请注意,对于变量o,我已经解决了类似的、更简单的问题):

SelectionList=(SelectionList)support.getComponent();
// [...]

((DefaultListModel您必须给它起一个通用名,比如
T extends Base
,然后您使用的
T
的任何地方都是相等的。两个未知数不是隐式相同的

要有一个“本地”泛型,您可以提取这样一个方法

public <T extends Base> void method() throws Exception {
    Wrapper<T> o = (Wrapper<T>) t.getTransferData(SelectionList.flavour);
    int index = location.getIndex();
    if(location.isInsert())
         ((DefaultListModel<Wrapper<T>>)list.getModel()).add(index, o);
}
public void方法()引发异常{
包装器o=(包装器)t.getTransferData(SelectionList.flavor);
int index=location.getIndex();
if(location.isInsert())
((DefaultListModel)list.getModel()).add(index,o);
}

这使得方法本身是通用的,不是吗?我可能是错误的,来自C++背景,但这不意味着方法本身是通用的,所以如果不使用T参数,那么会创建警告吗?那么警告只会移动。也不起作用:<代码>未检查的CAST <代码>旅行到
SelectionList=(SelectionList)support.getComponent();
以及到
o=(Wrapper)t.getTransferData(SelectionList.flavor);
(这是无法避免的,因为这将导致
((DefaultListModel)list.getModel())上的转换错误。添加(索引,o);
);然后必须通过通配符
SelectionList@Zsar它将问题转移到方法,但为您要求的
T
值提供等价性。未检查的强制转换是警告,而不是错误。这意味着编译器无法验证您使用的强制转换。最好的选择是避免在首先,让所用字段的泛型正确。好吧,强制转换是不可避免的;有问题的API方法返回Object和JComponent-两者都没有泛型。-我只是在强制转换错误吗?显然,一段没有警告的代码是我的目标,我可能错误地认为表面上明显的方法是可能的和/或简单的此外,将泛型参数放入方法声明中是不可能的:它会创建一个与TransferHandler.importData的名称冲突-此方法应该覆盖它。
unchecked call to add(int,E) as a member of the raw type javax.swing.DefaultListModel
SelectionList<?> list = (SelectionList<?>)support.getComponent();
// [...]
  ((DefaultListModel<Wrapper<?>)list.getModel()).add(index, o);
unchecked cast
  required: javax.swing.DefaultListModel<Wrapper<?>>
  found:    javax.swing.ListModel<Wrapper<capture#1 of ?>>
SelectionList<? extends Base> list = (SelectionList<? extends Base>)support.getComponent();
// [...]
  ((DefaultListModel<Wrapper<? extends Base>)list.getModel()).add(index, o);
unchecked cast
  required: javax.swing.DefaultListModel<Wrapper<? extends Base>>
  found:    javax.swing.ListModel<Wrapper<capture#1 of ? extends Base>>
@SuppressWarnings("unchecked")
public boolean importData(TransferHandler.TransferSupport support)
{
  if(this.canImport(support))
  {
    Transferable t = support.getTransferable();
    SelectionList list = (SelectionList)support.getComponent();
    Wrapper o;
    try{ o = (Wrapper)t.getTransferData(SelectionList.flavour); }
    catch(Exception e) { return false; }

    importIt((DefaultListModel<Wrapper>)list.getModel(), list.getDropLocation(), o);

    return true;
  }
  else
    return false;
}

public <T extends Base> void importIt(DefaultListModel<Wrapper<T>> model, JList.DropLocation location, Wrapper<T> o)
{
  if(location.isInsert())
    model.add(location.getIndex(), o);
  //else link
}
method importIt in class imise.app.SelectionList.SelectionListTransferHandler cannot be applied to given types;
  required: javax.swing.DefaultListModel<imise.app.OntologyMemberWrap<T>>,javax.swing.JList.DropLocation,imise.app.OntologyMemberWrap<T>
  found: javax.swing.DefaultListModel<imise.app.OntologyMemberWrap>,javax.swing.JList.DropLocation,imise.app.OntologyMemberWrap
  reason: no instance(s) of type variable(s) T exist so that argument type javax.swing.DefaultListModel<imise.app.OntologyMemberWrap> conforms to formal parameter type javax.swing.DefaultListModel<imise.app.OntologyMemberWrap<T>>
public <T extends Base> void method() throws Exception {
    Wrapper<T> o = (Wrapper<T>) t.getTransferData(SelectionList.flavour);
    int index = location.getIndex();
    if(location.isInsert())
         ((DefaultListModel<Wrapper<T>>)list.getModel()).add(index, o);
}