【问题标题】:Java - method argument for any instance extending a given objectJava - 扩展给定对象的任何实例的方法参数
【发布时间】:2015-08-01 22:34:47
【问题描述】:

由于我不知道如何表达我的问题,以便仅通过谷歌搜索获得帮助结果,我决定在这里提问。我只是在寻找一种方法来告诉一个方法,它应该让每个 Object 扩展一个特定的类。以下是我到目前为止尝试过的事情:

public void method( Object<? extends Component> obj );

public void method( Component c );

第二个的问题是我必须在 method() 接受它之前再次将每个实例转换为 Component,而第一个对我不起作用。谁能给我一个快速的解决方案?

【问题讨论】:

  • 在调用方法之前需要将类强制转换为 Component,这很奇怪。这不应该是这样。你能提供一段需要强制转换的代码吗?您可能还有其他问题。
  • 你到底是什么意思告诉方法来扩展某个类?
  • IEntity e = es.createEntity(); e.addComponent((Component)new Position(x, y, z));给你...
  • Object&lt;? extends Component&gt; 没有意义
  • Object 不是泛型类型,因此您的第一个解决方案将不起作用。您的第二个解决方案应该可以正常工作,并且可以接受任何组件或组件的子类型。

标签: java object inheritance methods parameters


【解决方案1】:

public void method( Component c ); 的第二种形式是正确的,如果您需要进行类型转换,那么您尝试将类型不是 Component 或 Component 子类的变量作为参数传递。我不知道为什么。

使用 Object 类型声明变量通常不是正确的做法,您应该在知道时使用正确的类型来定义它们。

Typecast 是一种告诉编译器您知道该引用所指向的对象的类型的方法,当该引用由于任何原因不具有该类型时。

【讨论】:

    【解决方案2】:

    如果您要定义一个采用 Component 子类型的方法,请使用 public &lt;T extends Component&gt; void method(T t){your code here}。这适用于任何对象,即组件可以替换为具有子类的任何其他类。

    【讨论】:

    • 这通常不需要。为什么不将参数定义为 Component?
    • “我只是在寻找一种方法来告诉一个方法,它应该让每个对象都扩展一个特定的类。”我的印象是您想在方法 def 中使用“扩展”,但是是的,简单的“组件”将适用于参数类型。
    【解决方案3】:

    第二个的问题是我必须强制转换每个实例 在 method() 接受它之前再次到 Component

    不,你不必强制转换任何东西,这就是多态性的工作原理。

    例如:

    class A {
    }
    
    class B extends A {
    }
    
    class C extends B {
    }
    
    public class Main {
    
        private void method(final A a) {
        }
    
        public static void main(final String[] args) {
            final Main main = new Main();
            main.method(new B());
            main.method(new C());
        }
    }
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2018-08-01
      • 1970-01-01
      • 2021-12-24
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多