使用泛型可以更好地解决这个问题

时间:2011-12-15 20:30:40

标签: java generics

我很确定我可以用Java泛型来解决这个问题,所以我想问一下......假设我有一些类,每个类都实现了一个公共接口,在公共接口中有一个名为{{1}的方法},我想制作通用的。我遇到的问题是每个类都返回一个不同的对象类型,所以理想情况下我希望它们是通用的,然后在调用getData的实现类中,将它们转换回原始类型。如果我要转换为getData并返回特定类型,我可以看到它是如何工作的,但是我能用Generics完成相同的最终结果吗?

这是一些用于概述问题的伪代码:

Object

7 个答案:

答案 0 :(得分:5)

您可能需要的是通用界面:

public interface X<T> {
    Map<DateTime, Map<String, T>> getData();
}

public class A implements X<CustomObjectA> {
    @Override
    public Map<DateTime, Map<String, CustomObjectA>> getData() {
        ...
    }
}

public class B implements X<CustomObjectB> {
    @Override
    public Map<DateTime, Map<String, CustomObjectB>> getData() {
        ...
    }
}

public class C {
    public static void main(String[] args) {
        X<CustomObjectA> a = new A();
        Map<DateTime, Map<String, CustomObjectA>> m1 = a.getData();
        X<CustomObjectB> b = new B();
        Map<DateTime, Map<String, CustomObjectB>> m2 = b.getData();
    }
}

答案 1 :(得分:2)

你需要这样的东西:

public interface X<T> {
    Map<Date, Map<String, T>> getData();
}

public class ClassA implements X<CustomObjectA> {

    private CustomObjectA customObjectA;
    private Map<DateTime, Map<String, CustomObjectA>> dataMap;

...

    public Map<DateTime, Map<String, CustomObjectA>> getData() {
        return this.dataMap;
    }
}

public class ClassB implements X<CustomObjectB> {

    private CustomObjectB customObjectB;
    private Map<DateTime, Map<String, CustomObjectB>> dataMap;

...

    public Map<DateTime, Map<String, CustomObjectB>> getData() {
        return this.dataMap;
    }
}

答案 2 :(得分:2)

import java.util.Calendar;
import java.util.Map;


public class GenericsExample {

  public static interface X<T> {
    public Map<Calendar, Map<String, T>> getData();
  }

  public static class A implements X<Long> {
    private Map<Calendar, Map<String, Long>> dataMap;
    public Map<Calendar, Map<String, Long>> getData() {
        return this.dataMap;
    }
  }

  public static class B implements X<Double> {
      private Map<Calendar, Map<String, Double>> dataMap;
      public Map<Calendar, Map<String, Double>> getData() {
          return this.dataMap;
      }
  }

  public static void main(String[] args) {
    X<Long> a = new A();
    X<Double> b = new B();
    Map<Calendar, Map<String, Long>> longData = a.getData();
    Map<Calendar, Map<String, Double>> doubleData = b.getData();
  }
}

答案 3 :(得分:1)

仅仅使接口通用是不够的?

public interface x <T> {
    public Map<String,T> getData()
}

然后当然这些类必须实现像

这样的接口
public class ClassA implements x<CustomObjectA>

答案 4 :(得分:1)

让CustomObjectA和CustomObjectB扩展一个公共超类。然后,将界面中的方法声明修改为:

public Map<DateTime, Map<String, ? extends CustomObjectSuperclass>> getData();

答案 5 :(得分:1)

这样的事情应该会有所帮助:

public interface GenericObject<T> {
    public Map<DateTime, Map<String, T>> getData();
}

public class ClassA implements GenericObject<CustomObjectA> {
    public Map<DateTime, Map<String, CustomObjectA>> getData() {
        // ...
    }
}

public class ClassB implements GenericObject<CustomObjectB> {
    public Map<DateTime, Map<String, CustomObjectB>> getData() {
        // ...
    }
}

答案 6 :(得分:1)

我的回答可能看起来有些偏差,因为我不会直接回答你的问题,但它可能是最合适的一个(我无法说明,因为你没有提供关于你的课程的详细信息)

如果CustomObjectA和CustomObjectB确实完全不相关,则不要为getData方法定义接口。对于ClassA和ClassB,此方法返回完全不同的内容,并且在同一接口下对它们进行分组没有多大意义。您仍然可以使用ClassA.getData()和ClassB.getData(),但是您永远无法使用继承在同一段代码中使用它们。但它绝不应该发生,因为getData返回的内容在两种情况下完全不同。

在你的问题中:

  

然后在调用getData的实现类中,将它们转换回来   他们的原始类型。

听起来不对。您应该在更高层次上重新考虑您的设计,而不是仅仅尝试制作一些部件泛型。