【问题标题】:Enforcing that an object has specific kinds of methods?强制对象具有特定类型的方法?
【发布时间】:2016-09-02 00:57:35
【问题描述】:

我正在创建一个接受对象列表作为参数的新类。

但是我想让这些对象可以是任何东西,只要它们具有某些方法,例如返回单个 double.getValue() 方法或返回单个 @987654324 的 .getTimestamp() 方法@等

这可以吗?

【问题讨论】:

  • 要要求对象有一定的方法,编程到有方法的接口。但是你真的在问泛型类型吗?

标签: java oop object polymorphism


【解决方案1】:

您可以使用interface 或实现继承,

 interface Foo{
   long getTimestamp();
 }

 class Bar implements Foo{
   ... impl ..
 }

然后您的方法将采用 Foo 的子类型列表(超类型)

 void fn(List<? extends Foo> foos){
    for(Foo foo:foos){
      long time = foo.getTimestamp();
    }
 } 

【讨论】:

  • 这适用于自定义类,但需要注意的是,对于库中的类实际上并没有这样做的方法。下一个最好的方法是使用反射来检查该方法是否在类中声明,如果没有则抛出NoSuchMethodException,这很混乱。
  • 所以List&lt;? extends Foo&gt; foos 表示fn() 只接受扩展接口Foo 的对象列表?
  • 对象类是否必须扩展 foo,而不是实现它?可以是List&lt;? implements Foo&gt; foos
  • @user54089 在这种情况下 Foo 是一个接口,因此类只能实现它,不能扩展它,只有接口可以扩展接口
  • @user54089 我不是语言的设计者 :)
【解决方案2】:

只要定义这些对象,您就可以通过使用接口来做到这一点:

interface MyInterface {
    double getValue();
    long getTimestamp();
}

class MyClass1 implements MyInterface {
    @Override
    public double getValue() {
        // ...
    }

    @Override
    public long getTimestamp() {
        // ...
    }
}

void someMethod(List<MyInterface> items) {
    for (MyInterface item : items) {
        double value = item.getValue();
        long timestamp = item.getTimestamp();
        // ...
    }
}

如果您没有定义这些对象的类,则无法在编译时强制执行它。可以通过精心制作且丑陋的反射黑客在运行时强制执行它。

【讨论】:

    【解决方案3】:

    界面可以帮助您解决问题。您可以为您在其中提供的以下每个声明单独实现。 干杯。 :)

    【讨论】:

      【解决方案4】:

      我认为你需要反思。您无法控制可能传递给您的代码的对象类型,您只想检查它们是否符合您的标准。正确的?当他们这样做时,您希望能够调用预期的方法。

      搜索“Java 反射”。

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2019-10-27
        • 2013-04-16
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2018-10-08
        • 2011-07-09
        • 2018-11-24
        相关资源
        最近更新 更多