代码之家  ›  专栏  ›  技术社区  ›  The Dissonant

根据调用方法更改返回类型

  •  4
  • The Dissonant  · 技术社区  · 17 年前

    基本上,我想要的是两个返回值略有不同的公共方法来调用同一个方法来完成所需的任何工作。它们都返回私有方法的返回值,但是私有方法将知道如何根据调用它的公共方法返回正确的值。

    示例方法:

    public Map<Type1, Type3> doSomething1();
    public Map<Type2, Type3> doSomething2();
    
    private Map<Type1/Type2, Type3> doSomething(); 
    

    因此,在上面的例子中,doSomething()返回Type1或Type2作为Map的键类型,具体取决于调用它的公共方法。它能够执行简单的检查,并用正确类型的对象填充Map。

    也许这可以通过一些巧妙的Java反射来实现?我不确定。这一切似乎都很可疑,所以如果有更好的方法,我洗耳恭听。

    7 回复  |  直到 17 年前
        1
  •  8
  •   jrharshath    17 年前

    更好的方法是将doSomething()重构为更小的函数,创建两个名为doSomethingFor1()和doSomethingHor2()的新函数。这两个函数都可以重用旧doSomething()的重构部分。

    现在调用doSomething1()并使用doSomethingFor1()。

    同样,doSomething2()应该使用doSomethingFor2()。

    干杯,

        2
  •  3
  •   Sam Saffron    17 年前

    请注意:

    如果有一个共同的子类型 Type1 Type2 SuperType ,然后说第一种类型是 ? extends SuperType 将工作。

    这里有一个小例子,它使用 Integer Double Number

    private Map<Integer, String> doSomethingForInteger() {
      HashMap<Integer, String> map = new HashMap<Integer, String>();
      map.put(10, "Hello");
      return map;
    }
    
    private Map<Double, String> doSomethingForDouble() {
      HashMap<Double, String> map = new HashMap<Double, String>();
      map.put(3.14, "Apple");
      return map;
    }
    
    public Map<? extends Number, String> doSomething(boolean b) {
      if (b)
        return doSomethingForInteger();
      else
        return doSomethingForDouble();
    }
    

    doSomething 方法将返回两种类型的 HashMap s取决于 boolean 那是通过的。要么 HashMap<Integer, String> HashMap<Double, String> 被退回 方法。

    做点什么 带着一个 布尔

    Map<? extends Number, String> map1 = doSomething(true);
    Map<? extends Number, String> map2 = doSomething(false);
    

    map1 最终将以 Hashmap<Integer, String> map2 Hashmap<Double, String> .

        3
  •  1
  •   Erich Kitzmueller    17 年前

        4
  •  1
  •   Blair Zajac    17 年前

    第一个问题是为什么你需要这个确切的结构。

    public Map<Object, Type3> doSomething();
    

    如果Type1和Type2没有共同的超类型。如果你确实有一个通用的超类型,你可以使用它来代替对象。

        5
  •  1
  •   user44242    17 年前

    如果你只根据一些数据以不同的方式进行实例化,那么最简单的方法就是声明一个私有内部接口:

    private interface Instantiator<T> {
    
         T getNew(Data data);        
    
    }
    

    private <T> Map<T,Type3> doSomething(Instantiator<T> instantiator) {...}
    

    作为方法签名,并让公共方法使用适当的Instantiator实现调用它。

        6
  •  0
  •   van    17 年前

    你绝对可以通过使用反射分析堆栈来做到这一点。但我会尽量避免它,并且:

    • 返回基类型(或对象)并在调用者中正确转换它,无论如何你都必须这样做
        7
  •  0
  •   Ande Turner    16 年前

    你可以对闭包的概念进行建模:

    interface MappingClosure {
        public void map(Map, MapProvider);
    }
    


    class Caller implements MappingClosure {
         public void map(final Map MAP, final MapProvider CALLEE) {
             this.MAP = specialise(MAP);
             // CALLEE USED AS KEY
         }
    }
    


    class MapProvider {  
        public Map getMap(final MappingClosure CALLER) {
            return CALLER.map(mapInstance, this);
        }
    }
    

    然后,修改数据以适应对象需求与对象中需要它的方法不同。