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