Java 一般问题。遗产
我厌倦了下面的问题。请帮忙? 我有一个下面的界面Java 一般问题。遗产,java,generics,Java,Generics,我厌倦了下面的问题。请帮忙? 我有一个下面的界面 /** * <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
/**
* <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();
}
/**
*时间戳的类型。例如:日期、长度、日历等
*
*/
公共接口时间戳
{
/**
*返回时间戳。
*@返回
*/
公共T getTimeStamp();
}
在我的代码中,我有两个列表:
List<FileTimeStamp> f = new ArrayList<FileTimeStamp>();
List<DefaultTimeStamp> t = new ArrayList<DefaultTimeStamp>();
listf=newarraylist();
List t=new ArrayList();
我想创建一个方法,它接受上面两个包含时间戳的列表,然后合并它们。
例:
void合并(列表l1、列表l2)
{
l1.addAll(l2);
集合。排序(l1);
}
但是上面的代码会生成编译时警告
无效合并(列表l1、列表l2)泛型类时间戳缺少类型参数
其中T是一个类型变量: T扩展接口时间戳中声明的对象 在没有编译时警告的情况下,我应该如何定义上述方法?我的
无效合并(列表>l2)
应该是什么????在左边是?这对我很有用
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);
}
}
公共接口时间戳{
公共T getTimeStamp();
}
公共类FileTimeStamp实现时间戳{
@凌驾
公共整数比较(时间戳arg0){
//TODO自动生成的方法存根
返回0;
}
@凌驾
公共T getTimeStamp(){
//TODO自动生成的方法存根
返回null;
}
}
公共类DefaultTimeStamp实现时间戳{
@凌驾
公共整数比较(时间戳arg0){
//TODO自动生成的方法存根
返回0;
}
@凌驾
公共T getTimeStamp(){
//TODO自动生成的方法存根
返回null;
}
}
公开课{
公共静态void main(字符串[]args){
列表l1=新的ArrayList();
列表l2=新的ArrayList();
Abcd Abcd=新的Abcd();
合并(l1,l2);
}
无效合并(列表l1、列表l2){
l1.addAll(l2);
集合。排序(l1);
}
}
这对我很有用
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);
}
}
公共接口时间戳{
公共T getTimeStamp();
}
公共类FileTimeStamp实现时间戳{
@凌驾
公共整数比较(时间戳arg0){
//TODO自动生成的方法存根
返回0;
}
@凌驾
公共T getTimeStamp(){
//TODO自动生成的方法存根
返回null;
}
}
公共类DefaultTimeStamp实现时间戳{
@凌驾
公共整数比较(时间戳arg0){
//TODO自动生成的方法存根
返回0;
}
@凌驾
公共T getTimeStamp(){
//TODO自动生成的方法存根
返回null;
}
}
公开课{
公共静态void main(字符串[]args){
列表l1=新的ArrayList();
列表l2=新的ArrayList();
Abcd Abcd=新的Abcd();
合并(l1,l2);
}
无效合并(列表l1、列表l2){
l1.addAll(l2);
集合。排序(l1);
}
}
如果您关心类型安全,则必须具有相同的类型
您的问题的解决方案是:
public static <T> void merge(List<T> left, List< ? extends T> right) {
left.addAll(right);
}
我们将无法:
merge(fileTimeList, defaultTimeList);
成功的关键是必须将右侧
列表项分配给左侧
列表中的项目类型
在合并wan进行排序之后,这是任务的另一部分。要对列表进行排序,存储在列表中的类应实现接口Comparable
因此,我们最终的结构如下:
public interface TimeStamp extends Comparable<TimeStamp> {
}
public interface DefaultTimeStamp extends TimeStamp {
}
public interface FileTimeStamp extends TimeStamp {
}
所以我们可以说你有你想要的
但我会将操作和使用分开,在这里描述它是如何工作的;合并后,我将对其进行排序 如果您关心类型安全,则必须具有相同的类型 您的问题的解决方案是:
public static <T> void merge(List<T> left, List< ? extends T> right) {
left.addAll(right);
}
我们将无法:
merge(fileTimeList, defaultTimeList);
成功的关键是必须将右侧
列表项分配给左侧
列表中的项目类型
在合并wan进行排序之后,这是任务的另一部分。要对列表进行排序,存储在列表中的类应实现接口Comparable
因此,我们最终的结构如下:
public interface TimeStamp extends Comparable<TimeStamp> {
}
public interface DefaultTimeStamp extends TimeStamp {
}
public interface FileTimeStamp extends TimeStamp {
}
所以我们可以说你有你想要的
但我会将操作和使用分开,在这里描述它是如何工作的;合并后,我将对其进行排序 您的方法merge()是正确的。您所需要做的就是使用适当的数据类型来初始化f和t。请看下面我的答案。您的方法merge()是正确的。您所需要做的就是使用适当的数据类型来初始化f和t。看看我下面的答案。但我们如何处理时间戳的类型呢。我们需要声明一个要合并的类型-public T getTimeStamp();答案并没有涵盖这一点,更多的是关于泛型的工作原理。如果你仍然有问题,我会在几个小时内编辑答案,以适应你的情况。但我认为在这一点上,你应该设法自己去做。非常感谢你的帮助。这只是为了学习。我有正在运行的代码,只是我正在努力完善它。理想情况下,人们希望时间戳具有定义的类型。但我们如何处理时间戳的类型呢。我们需要声明一个要合并的类型-public T getTimeStamp();答案并没有涵盖这一点,更多的是关于泛型的工作原理。如果你仍然有问题,我会在几个小时内编辑答案,以适应你的情况。但我认为在这一点上,你应该设法自己去做。非常感谢你的帮助。这只是为了学习。我有正在运行的代码,只是我正在努力完善它。理想情况下,人们希望时间戳具有定义的类型。