Java泛型

Java泛型,java,generics,Java,Generics,谁来帮我弄这些仿制药 如果您有一个重载方法,其类型不同,可以作为参数,那么可以编写一个泛型方法,在运行时调用正确的方法吗?(抱歉,如果我的java技术很差,如果是) 例如: public interface CoolInterface { setOverloadedValue(String o); setOverloadedValue(Integer o); setOverloadedValue(Date o); } public interface ClazzProvide

谁来帮我弄这些仿制药

如果您有一个重载方法,其类型不同,可以作为参数,那么可以编写一个泛型方法,在运行时调用正确的方法吗?(抱歉,如果我的java技术很差,如果是)

例如:

public interface CoolInterface {
   setOverloadedValue(String o);
   setOverloadedValue(Integer o);
   setOverloadedValue(Date o);
}

public interface ClazzProvider {
   Class getClazz();
}

public class SomeUncoolClass {

   @AutowiredMagic CoolInterface coolGuy;
   @AutowiredMagic ClazzProvider clazzyProvider;

   public void helpMeMethod() {
      coolGuy.setOverloadedValue(getValue(clazzyProvider.getClazz()));
   }

   private ??? getValue(???) {
      return ???;
   }
}

getValue()的方法签名是什么?我如何实现它呢?

否-重载是在编译时选择的,编译器无法判断要使用哪个重载


您可能想看看,作为您想要接受的类型在您的控制下的情况下的一种解决方法,当您想要接受字符串/日期/对象时,它没有多大帮助:(

您可以完成类似于Joshua Bloch所称的类型安全异构容器(THC)的事情)在有效的Java第二版中

import java.util.*;

class TypesafeHeterogenousContainer {
    Map<Class<?>, Object> map = new HashMap<Class<?>, Object>();

    public <T> T get(Class<T> klass) {
        return klass.cast(map.get(klass));
    }

    public <T> void put(Class<T> klass, T thing) {
        map.put(klass, thing);
    }
}

public class Main {
    public static void main(String args[]) {
        TypesafeHeterogenousContainer thc = new TypesafeHeterogenousContainer();
        thc.put(String.class, "a string");
        thc.put(Integer.class, 5);
        System.out.println(thc.get(String.class)); // prints "a string"

        thc.put(String.class, 5); // compile-time error
    }
}
import java.util.*;
类类型安全异源容器{
地图,对象>();
公共交通工具(klass类){
返回klass.cast(map.get(klass));
}
公开作废(klass类,T类){
地图。放(克拉斯,东西);
}
}
公共班机{
公共静态void main(字符串参数[]){
TypesafeHeterogenousContainer thc=新的TypesafeHeterogenousContainer();
thc.put(String.class,“字符串”);
thc.put(Integer.class,5);
System.out.println(thc.get(String.class));//打印“字符串”
thc.put(String.class,5);//编译时错误
}
}
这完全不是通过重载实现的,因为这是不可能的,因为Java泛型使用类型擦除

你可以在这本书中或在网上的其他页面上阅读更多关于这方面的内容

  • …等等

如果你没有这本书,你可以从他2006年在Java One上的演讲中读到。

正如Jon Skeet所说,泛型在这种情况下没有帮助

您可以查看Visitor模式,它在polimorphic参数需要不同方法执行的某些情况下很有帮助。但是请注意:它只有在类型层次结构稳定时才有帮助

如果您想要一个类型列表不稳定的泛型处理,或者您不喜欢访问者模式的复杂性,我建议您使用
映射

private[static?]Map处理器=新的HashMap();
//初始化
processors.put(Integer.class,新的ValueProcessor(){
公共作废处理(对象值){
dostuff带((整)值);
}
});
processors.put(Date.class,new ValueProcessor(){
公共作废处理(对象值){
dostuff带((日期)值);
}
});
//等等。。。
公共接口处理器{
公共无效过程(客体价值);
}

我不确定这段代码的内涵是什么,但也许你想要这样的东西:

public interface CoolInterface<T> {
   void setOverloadedValue(T o);
}

public interface ValueProvider<T> {
   T getValue();
}

public class SomeUncoolClass<T> {

   private CoolInterface<? super T> coolGuy;
   private ValueProvider<? extends T> valueProvider;

   public void helpMeMethod() {
      coolGuy.setOverloadedValue(valueProvider.getValue());
   }
}
公共接口{
无效设置重载值(TO);
}
公共接口提供程序{
T getValue();
}
公共类{

private CoolInterface这段代码到底应该做什么?getValue()应该从它作为参数得到的类返回什么?@ChloeRadshaw:对于同一类问题,这是一种稍微不同的方法。将String/Integer/Date作为目标没有帮助,但对于其他类似情况的代码,这是一种替代方法。将进行编辑以使其更清晰。
public interface CoolInterface<T> {
   void setOverloadedValue(T o);
}

public interface ValueProvider<T> {
   T getValue();
}

public class SomeUncoolClass<T> {

   private CoolInterface<? super T> coolGuy;
   private ValueProvider<? extends T> valueProvider;

   public void helpMeMethod() {
      coolGuy.setOverloadedValue(valueProvider.getValue());
   }
}