Java 如何投出未知类
我有一门课:Java 如何投出未知类,java,class,casting,Java,Class,Casting,我有一门课: public class Example { public String name; } 但是这个类不必被调用,示例可能不同(比如示例2,另一个示例我不知道如何调用),问题是我不知道如何调用 在另一个类中,我有一个以对象列表为参数的方法。 我的示例类: public class ObjectClass{ public List<Object> doSomething(List<Object> objects) { for(
public class Example {
public String name;
}
但是这个类不必被调用,示例可能不同(比如示例2,另一个示例我不知道如何调用),问题是我不知道如何调用
在另一个类中,我有一个以对象列表为参数的方法。
我的示例类:
public class ObjectClass{
public List<Object> doSomething(List<Object> objects) {
for(int i = 0 ; i < objects.size();i++) {
Class<?> c = objects.get(i).getClass();
System.out.println("class name " + c.getCanonicalName());// i get name my class
System.out.println(((Example) objects.get(i)).name);
}
}
}
公共类ObjectClass{
公共列表doSomething(列表对象){
对于(int i=0;i
当我将cast示例更改为另一个类时,比如System.out.println(((c)objects.get(I)).name)代码>
它不起作用
我的班级可以用不同的方式来称呼自己,但以身作则是行不通的。
一般来说,我想得到name的值,但不知道类是如何命名的。但我选择了具有字段名的类(或通过具有注释)。
编辑:这是一个问题,这是我的家庭作业,我不能更改类示例,也不能更改方法doSomething。欢迎来到多态性的奇妙世界。以下是您可以做的:
interface Named
{
String getName();
}
public class Example implements Named
{
public String name;
@Override
public String getName()
{
return name;
}
}
public class AnotherExample implements Named
{
public String name;
@Override
public String getName()
{
return name;
}
}
然后你可以这样做:
System.out.println(((Named) objects.get(i)).getName());
System.out.println(objects.get(i).getName());
当然,我还建议您执行以下操作:
public List<Named> doSomething(List<Named> objects) {
澄清后编辑:
如果无法添加自己的接口,请尝试以下操作:
Object foo = objects.get(i);
if( foo instanceof Example )
{
Example example = (Example)foo;
...do something with example...
}
else if( foo instanceof AnotherExample )
{
AnotherExample anotherExample = (AnotherExample)foo;
...do something with anotherExample...
}
else
{
assert false; //I do not know what class this is.
}
如果特别关注字段名,还可以通过反射遍历所有字段并访问正确的字段
public List<Object> doSomething(List<Object> objects) {
for (int i = 0; i < objects.size(); i++) {
Class<?> c = objects.get(i).getClass();
for (Field field : c.getFields()) {
if ("name".equals(field.getName())) {
try {
System.out.println("class name " + c.getCanonicalName());// i get name my class
System.out.println(field.get(objects.get(i)));
} catch (Exception e) {
}
}
}
}
return null;
}
public List doSomething(列出对象){
对于(int i=0;i
感谢try帮助,但我在帖子中添加了edit,因为我无法更改类示例,也无法添加自己的接口,我只能将代码写入类ObjectClass(我无法chcange声明方法doSomethnig),我认为这仍然不是我的意思,因为我的homowerk是我不知道如何调用类。我的老师像他想的那样给班级打了个例子,我不知道班级的名字。好吧,如果这是家庭作业,那么这几乎可以肯定是关于多态性的,所以你的解决方案在我答案的第一部分。你对作业有些误解:要么你实际上被允许更改示例
并向其添加接口,要么你应该创建自己的示例
类,在这种情况下,你当然可以添加任何你想要的接口。