Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/356.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_Class_Casting - Fatal编程技术网

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是我不知道如何调用类。我的老师像他想的那样给班级打了个例子,我不知道班级的名字。好吧,如果这是家庭作业,那么这几乎可以肯定是关于多态性的,所以你的解决方案在我答案的第一部分。你对作业有些误解:要么你实际上被允许更改
示例
并向其添加接口,要么你应该创建自己的
示例
类,在这种情况下,你当然可以添加任何你想要的接口。