【问题标题】:Generic parameters in method - Java方法中的通用参数 - Java
【发布时间】:2015-05-23 00:38:09
【问题描述】:

我有一个界面:

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) {
    ...
}

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

【问题讨论】:

  • 仅供参考:public ArrayList&lt;?&gt; b(); 就足够了。 所有 Java 类都是Object.的后代
  • 你说得对,我只是看到这样并没有改变它,谢谢。

标签: java generics methods parameters


【解决方案1】:

是的。可以创建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) {
        // ...  
    }
}

【讨论】:

  • 好吧,那没用,:/ 无论如何,谢谢,我将尝试其他答案。
  • 我像你说的那样在接口中声明方法: public void c(T object) { ... } 并尝试在类中实现它,如下所示: public c(SomeObject object ) { ... } 我得到了一个错误。
  • @AndrésMarotta Ahhh...不,您也可以使用通用签名来实现它。但是您可以使用SomeObject 调用它。或者你使整个类/接口通用。您的问题并不完全清楚。
  • 我会尝试更好地解释我(我不是以英语为母语的人)。我有一些具有相同方法但对象不同的类。例如,每个类都在数据库中插入一个对象,但每个类都使用“他的”对象进行插入。现在,我想声明一个接口来“分组”这些方法并强制类实现主题。为此,接口对于将通过实现它的类传递的对象类型最“通用”。我希望这更清楚。
【解决方案2】:

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

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

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。显然埃菲尔有它,这有点争议。

【讨论】:

  • 我试过了,唯一能解决的就是错误。我可以这样做: public void c(SomeObject object) { ... } 而且我没有收到编译错误。但我不能像 SomeObject 类型那样使用“对象”。我的意思是,它没有得到他的方法。
  • 你应该可以进入ClassA.c的正文。查看我的编辑。
  • 哦,是我的错。我没有更改参数的名称。这样可行!谢谢!
猜你喜欢
  • 2014-02-15
  • 1970-01-01
  • 2010-09-19
  • 1970-01-01
  • 1970-01-01
  • 2015-01-15
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多