Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/345.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 迭代时对象上缺少方法_Java - Fatal编程技术网

Java 迭代时对象上缺少方法

Java 迭代时对象上缺少方法,java,Java,出于实践目的,我想实现以下目标 界面简单 实现该接口的简单类 创建该类的两个实例 将它们存储在集合中(本例中为ArrayList) 迭代调用类上的方法的集合 接口: public interface MyInterface { void sayHello(); } 类别: public class Person implements MyInterface{ private String name; public Person(String nameValue) {

出于实践目的,我想实现以下目标

  • 界面简单

  • 实现该接口的简单类

  • 创建该类的两个实例

  • 将它们存储在集合中(本例中为ArrayList)

  • 迭代调用类上的方法的集合

  • 接口:

    public interface MyInterface {
         void sayHello();
    }
    
    类别:

    public class Person implements MyInterface{
        private String name;
    
        public Person(String nameValue) {
            name = nameValue;
        }
    
        @Override
        public void sayHello() {
            System.out.println(name);
        }
    }
    
    主要内容:

    但是当我检查person时,我没有看到类方法。 经过一番尝试后,这段用于转换Person的代码似乎起到了作用:

    ((Person) person).sayHello();
    
    我的方法到哪里去了?为什么我要投才能得到它?
    我的背景是Javascript,我希望它就在那里。

    您使用的是原始类型:

    static void greeter(ArrayList persons)
    
    因此,您只能访问
    persons.forEach
    对象
    类的方法

    您应该将其更改为:

    static void greeter(List<MyInterface> persons)
    
    静态无效迎宾员(列出人员)
    

    请注意,我使用了
    List
    接口而不是
    ArrayList
    实现,因为编程到接口被认为是更好的做法。

    这就是泛型的用途。不要使用没有泛型类型的原始类型。编译器应该就此向您发出警告

    你想要

     static void greeter(List<MyInterface> persons){
    
    静态无效迎宾员(列出人员){
    
    这样,编译器就知道
    persons
    包含
    MyInterface
    的实例,您可以调用该接口的方法,而无需进行类转换


    如果没有它,它只能假设它们是
    对象
    更改
    问候者
    函数并添加一个通用的
    MyInterface

    static void greeter(ArrayList<MyInterface> persons) {
    ...
    }
    
    静态无效迎宾员(ArrayList人员){
    ...
    }
    
    否则Java不会对数组列表中存储的内容一无所知,并认为它是一个对象(因为一切都是一个对象)。显然,对象没有
    sayHello
    方法,这就是您必须进行强制转换的原因

    另一件事,更多的是一种代码风格-只是一个建议:


    在java中,我们通常尽可能使用接口,因此无论是在“greeter”实现还是在方法中,都更喜欢接口
    List
    而不是具体实现
    ArrayList

    在传递参数时,您没有添加ArrayList的类型。请尝试下面的代码

    static void greeter(ArrayList <MyInterface> persons){
        persons.forEach((person -> {
            person.sayHello();
        }));   
     }
    
    静态无效迎宾员(ArrayList人员){
    persons.forEach((person->{
    person.sayHello();
    }));   
    }
    
    更改自:静态无效迎宾员(ArrayList人员) 收件人:静态无效迎宾员(ArrayList人员)

    在第一种方式中,我们使用的泛型ArrayList并没有显示对象的类型。
    在第二种方式中,我们解释了ArrayList必须具有MyInterface类型的对象,因此现在将在该ArrayList中显示方法sayHello。

    您使用的是原始类型:
    ArrayList
    。请确保指定类型参数。例如,
    静态void greeter(ArrayList persons)
    ,或者更好:
    静态void greeter(ListI肯定会阅读这篇文章,了解良好的OOP实践:对接口(而不是实现)进行编码,如下所示:List personHolder=new ArrayList();List personHolder=new ArrayList();
    
    static void greeter(ArrayList<MyInterface> persons) {
    ...
    }
    
    static void greeter(ArrayList <MyInterface> persons){
        persons.forEach((person -> {
            person.sayHello();
        }));   
     }