我目前正在尝试遵循Drag& Drop教程here。
可悲的是,示例代码并不特别关心没有警告,而我希望自己的代码是干净的。
我希望在以下上下文中从该页面实现importData方法:
class Base;
class Wrapper<T extends Base>;
class SelectionList<T extends Base> extends JList<Wrapper<T>>;
为此,我制作了以下代码:
public boolean importData(TransferHandler.TransferSupport support)
{
if(this.canImport(support))
{
Transferable t = support.getTransferable();
SelectionList list = (SelectionList)support.getComponent();
JList.DropLocation location = list.getDropLocation();
Wrapper<? extends Base> o;
try{ o = (Wrapper<? extends Base>)t.getTransferData(SelectionList.flavour); }
catch(Exception e) { return false; }
int index = location.getIndex();
if(location.isInsert())
((DefaultListModel)list.getModel()).add(index, o);
//else link
return true;
}
else
return false;
}
显然正在进行中。
此时,我收到了警告
((DefaultListModel<Wrapper<?>)list.getModel()).add(index, o);
:
unchecked call to add(int,E) as a member of the raw type javax.swing.DefaultListModel
毫不奇怪。
我一直在尝试几种方法来解决这个问题; (注意我在变量o的情况下如何解决类似的,更简单的问题):
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 ?>>
Aka将这两个通配符视为不同的可能性。
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>>
如何指定相关类型满足SelectionList 的定义,因此投射 不 未选中?
我无法读到与相关问题有关的guide here,但它似乎在几个地方自相矛盾;值得注意的是,它似乎立即宣称
两者显然都是不正确的;可能是我自己的误解。
试着关注@Peter_Lawrey我提出了这个问题:
@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
}
希望这样做。它的优点是可以将importData放入一个扩展TransferHandler的中间类中,所有其他TransferHandler都可以自己扩展,只覆盖importIt - 不需要注释。
然而,这会产生错误:
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>>
并没有什么不同,如果在通话中添加通配符(与开头相同的问题)。
看起来我必须明确指定内部泛型。所以我需要使importData泛型。然后它不再覆盖TransferHandler.importData(它必须)。
...或者我猜,只需用@suppressWarnings("unchecked")
注释所有方法就可以了;我更喜欢一个合适的解决方案,但它看起来好像没有(很高兴被证明是错误的)。
答案 0 :(得分:3)
您必须为其指定通用名称errorHandler
,然后您使用T extends Base
的所有位置都相同。两个未知数并非含蓄相同。
拥有&#34;本地&#34;通用你可以提取这样的方法。
T