0

我厌倦了下面的问题。请帮忙?我有一个下面的界面

/**
* <T> Type of Timestamp. For ex: Date, long, Calendar etc
* 
*/
public interface TimeStamp<T> extends Comparable<TimeStamp<T>>
{

/**
* Returns the timestamp. 
 * @return 
*/
 public T getTimeStamp();

 }

在我的代码中,我有 2 个列表:

    List<FileTimeStamp> f = new ArrayList<FileTimeStamp>();
    List<DefaultTimeStamp> t = new ArrayList<DefaultTimeStamp>();

我想创建一个方法,该方法采用上述 2 个包含时间戳的列表,然后将它们合并。前任:

void merge(List<TimeStamp> l1, List<TimeStamp> l2)
{
    l1.addAll(l2);
    Collections.sort(l1);
}

但是上面会产生编译时警告。

void merge(List l1, List l2)
缺少泛型类 TimeStamp 的类型参数,
其中 T 是类型变量:T 扩展接口 TimeStamp 中声明的对象

我应该如何在没有任何编译时警告的情况下定义上述方法?我的应该是什么void merge(List<TimeStamp<????>> l1, List<TimeStamp<????>> l2)???在左边是?

4

2 回答 2

4

如果您关心类型安全,则必须具有相同的类型。

您的问题的解决方案是:

public static <T> void  merge(List<T> left, List< ? extends T> right) {
         left.addAll(right);
}

这将如何工作:

  List<TimeStamp> timeList = new ArrayList<>();
  List<DefaultTimeStamp> defaultTimeList = new ArrayList<>();
  List<FileTimeStamp> fileTimeList = new ArrayList<>();

我们能够很好地执行:

 merge(timeList, defaultTimeList);
 merge(timeList, fileTimeList);

 merge(timeList, timeList);
 merge(defaultTimeList, defaultTimeList);
 merge(fileTimeList, fileTimeList);

我们将无法:

 merge(fileTimeList, defaultTimeList);

成功的关键是right列表项必须分配给列表中的项目类型left

合并后要排序,这是任务的另一部分。要对列表进行排序,存储在列表中的类应实现接口Comparable

所以我们最终得到这样的结构:

    public interface TimeStamp extends Comparable<TimeStamp> {

    }

    public interface DefaultTimeStamp extends TimeStamp {

    }

    public interface FileTimeStamp extends TimeStamp {

    }

要合并和排序,我们需要限制至少T实现的 to 类型Comparable<T>T

这看起来像这样:

public static <T extends Comparable<? super T>> void  mergeAndSort(List<T> left, List< ? extends T> right) {

    left.addAll(right);
    Collections.sort(left);
}

所以我们可以说你有你想要的。


但是我会将操作分开并使用Iterables.concat(Iterable ...),在将多个集合合并到一个逻辑集合中?描述它是如何工作的;合并,然后我会对其进行排序。

于 2012-11-07T11:44:50.963 回答
0

这对我有用,

public interface TimeStamp<T> extends Comparable<TimeStamp<T>> {
    public T getTimeStamp();
}
public class FileTimeStamp<T> implements TimeStamp<T>{

    @Override
    public int compareTo(TimeStamp<T> arg0) {
        // TODO Auto-generated method stub
        return 0;
    }

    @Override
    public T getTimeStamp() {
        // TODO Auto-generated method stub
        return null;
    }

}
public class DefaultTimeStamp<T> implements TimeStamp<T>{

    @Override
    public int compareTo(TimeStamp<T> arg0) {
        // TODO Auto-generated method stub
        return 0;
    }

    @Override
    public T getTimeStamp() {
        // TODO Auto-generated method stub
        return null;
    }

}
public class Abcd<T> {
    public static void main(String[] args) {
        List<FileTimeStamp<Date>> l1 = new ArrayList<FileTimeStamp<Date>>();
        List<DefaultTimeStamp<Long>> l2 = new ArrayList<DefaultTimeStamp<Long>>();
        Abcd abcd = new Abcd();
        abcd.merge(l1, l2);
    }

    void merge(List<TimeStamp> l1, List<TimeStamp> l2)  {
        l1.addAll(l2);
        Collections.sort(l1);
    }
}
于 2012-11-07T11:40:43.557 回答