我正在尝试为大学的任务单创建一个界面。我必须为各种数据结构实现所有这些方法,所以我想实现这个接口。
问题是,数据结构必须是通用的:LinearList<T>
,其中键的类型为T.现在,不同的数据结构具有不同的元素ex。 LinearList<T>
有ListItem<T>
个元素,树有TreeNode<T>
。
所以我想我创建了一个<C, T>
的接口,其中C = ListItem,T是ex类型。整数。
现在我有一些重载方法ex:
insert(T key)
insert(ListItem<T> item)
因此用户可以添加密钥,或者他可以添加例如另一个列表的头部。但是现在我收到编译错误,我不明白:
java:15: error: name clash: insert(T,int) and insert(C,int) have the same erasure
boolean insert(T key, int pos);
如何按照上面解释的方式启用重载?因为在一个抽象的课程中我尝试了它并且它起作用了。
修改 好的,就像在讨论的评论中我现在使用不同的方法名称。它接缝是其他集合用来解决问题的解决方案,并且如上所述隐藏(?)更多实现细节。非常感谢您的支持!
package interfaces;
/**
* Interface with all methods for the data-structs I have to learn for the exam
*
* <C> is the class of the Elements to be entered ex: ListItem<T>
* <T> the type of the elements stored in the data-structs
*
* @author
*/
public interface ExamPreparation<C, T> {
boolean insert(C item, int pos);
boolean insert(T key, int pos);
boolean insertAtHead(C item);
boolean insertAtHead(T key);
boolean insertAtTail(C item);
boolean insertAtTail(T key);
boolean insertSorted(C item, Comparator<T> comp);
boolean insertSorted(T key, Comparator<T> comp);
// ========== Remove Methods ==========
boolean remove(T key);
boolean removeAll(T key);
// ========== Overwrite Methods ==========
/**
* takes the first appearance of oldKey and overwrites it wit
h newKey
*
* @param newKey
* @param oldKey
* @return true if overwrited. False if oldKey is not in list
*/
boolean overwrite(T newKey, T oldKey);
/**
* takes all the oldKeys and overwrites it with the newKey
*
* @param newKey
* @param oldKey
* @return returns true if at least one oldkey was found
*/
boolean overwriteAll(T newKey, T oldKey);
/**
* overwrite at position
*
* @param newKey
* @param pos
* @return returns false if pos is not valid else true
*/
boolean overwriteAt(T newKey, int pos);
// ========== Other ==========
boolean contains(T key);
}
答案 0 :(得分:1)
如何声明新界面
interface ElementType<T> {
}
然后制作可能的元素类型;像这样扩展或实施ElememtType
:
interface ListItem<T> extends ElementType<T> {
}
interface TreeNode<T> extends ElementType<T> {
}
最后更改ExamPreparation
的声明
来自
public interface ExamPreparation<C, T>
到
public interface ExamPreparation<C extends ElementType<T>, T>
以下代码编译没有问题;
ListItem<String> item = null;
ExamPreparation<ListItem<String>, String> examPreparation = null;
boolean isInserted;
isInserted = examPreparation.insert("12", 0);
isInserted = examPreparation.insert(item, 0);