有 Java 编程相关的问题?

你可以在下面搜索框中键入要查询的问题!

具有多个声明的Java泛型

我正在使用以下泛型实现一个类:

public abstract class AbstractTask<T,V>
{
  public void method1 (T param1, V param2) {}
}

声明<T,K>可以是变量吗?我想通过以下方式扩展该类:

public class TaskOne extends AbstractTask<Integer,String>
{
  public void method1 (Integer param1, String param2) {}
}

public class TaskTwo extends AbstractTask<Number,Object,Double>
{
  public void method1 (Number param1, Object param2, Double param3) {}
}

有可能这样做吗

谢谢


共 (3) 个答案

  1. # 1 楼答案

    不,这是不可能的,Java编译器强制执行泛型,您将得到编译错误

  2. # 2 楼答案

    否,泛型类的所有实例的类型和方法参数数量必须相同

    如果我们知道您想要实现的目标,我们可能会提出替代方案。例如,如果这是关于将任务提交到线程池,则可以执行以下操作:

    final int x = ...;
    final String y = ...;
    final Number n = ...;
    new Runnable {
        @Override public void run() {
            // do something with x, y and n
        }
    }
    

    或者可以使用AOP代理捕获参数

    或者(如果您不需要类型安全性),您可以简单地

    void method1(Object... args);
    

    或者

  3. # 3 楼答案

    不,你不能

    您应该将V从普通的java.lang类型更改为参数的包装器

    public class TaskOne extends AbstractTask<Integer,StringWrapper>
    {
      public void method1 (Integer param1, StringWrapper param2) {}
    }
    
    public class TaskTwo extends AbstractTask<Number,ObjectAndDoubleWrapper>
    {
      public void method1 (Number param1, ObjectAndDoubleWrapper param3) {}
    }
    
    class ObjectAndDoubleWrapper {
        Object obj;
        Double doub;
    }
    

    等等

    显然,选择一个更合理的名称来反映您试图解决的问题