方法中的通用参数 - Java

时间:2015-05-23 00:38:09

标签: java generics methods parameters

我有一个界面:

public interface InterfaceA {
  public ArrayList<? extends Object> b();
  public Object b(String string);
  public void c(Object object);
}

实现它们时,前两种方法可以正常工作:

public class ClassA implements InterfaceA {
   public ArrayList<SomeObject> b() {
      ...
   }

   public SomeObject b(String string) {
      ...
   }
}

但我不能像这样实施第三个:

public void c(SomeObject object) {
    ...
}

有没有办法声明一个带有“generic”参数的方法来用不同的对象实现它?

2 个答案:

答案 0 :(得分:2)

是。可以制作generic method。像,

public <T> void c(T object);

也可以制作通用接口。像,

public interface InterfaceA<T> {
    public ArrayList<T> b();
    public T b(String string);
    public void c(T object);
}

然后实现可能看起来像

public class ClassA<T> implements InterfaceA<T> {
    @Override
    public ArrayList<T> b() {
        // ...
    }

    @Override
    public T b(String string) {
        // ...
    }

    @Override
    public void c(T object) {
        // ...  
    }
}

答案 1 :(得分:1)

我们不能,因为如果方法参数不同,那就是重载。

我们最接近的是在类上声明一个类型参数:

public interface InterfaceA<T> {
    public void c(T object);
}

public class ClassA implements InterfaceA<SomeObject> {
    @Override
    public void c(SomeObject object) {
        object.foo();
    }
}

class SomeObject {
    void foo() {
        System.out.println(1);
    }
}

但这可能是也可能不是你所追求的。

协变方法参数的问题(据我了解你所问的)是这样的:

InterfaceA a = new ClassA();
// passing Object to method which actually
// expects a SomeObject
a.c( new Object() );

维基百科有一些有趣的话要说:Covariant method argument type。显然埃菲尔有它,这有点争议。