Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/318.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,我目前正在创建一个类,它有一个对象类型的字段 我的问题是,当访问这个对象的成员时,编译器抛出一个符号not found错误,因为在编译时类是未知的。是否有办法忽略此问题,或在以后(即运行时)将其标记为resolve 具体而言: 我有一个链表,它收集类的列表,这些类存储关于UI控件的信息,并存储对真实UI控件的引用(这是作为obj的对象字段)。对象(obj)有一个hitbox成员(hb),我正试图为其设置一个属性 令人不快的是: items.get(this.curIndex.obj.hb.hov

我目前正在创建一个类,它有一个对象类型的字段

我的问题是,当访问这个对象的成员时,编译器抛出一个符号not found错误,因为在编译时类是未知的。是否有办法忽略此问题,或在以后(即运行时)将其标记为resolve

具体而言: 我有一个链表,它收集类的列表,这些类存储关于UI控件的信息,并存储对真实UI控件的引用(这是作为obj的对象字段)。对象(obj)有一个hitbox成员(hb),我正试图为其设置一个属性

令人不快的是:

items.get(this.curIndex.obj.hb.hovered=true

由于我不能自由发布源代码,这里有一个模型,以便更容易理解正在发生的事情

public class MenuButton {
    public HitBox hb;
    ...
}

public class NameEdit {
    public HitBox hb;
    ...
}

public class VolumeSlider {
    public HitBox hb;
    ...
}

public class HitBox {
    public Boolean hovered;
    ...
}

public class AObject {
    public String label;
    public String hint;
    public Object obj;
    ...
}

public class AContainer {
    public LinkedList<AObject> items=new LinkedList<>();

    public void add(Object obj) {
        items.add(obj);
    }
    ...
}

//elsewhere:
    public LinkedList<AContainer> containers=new LinkedList<>();
    ...
    containers.get(0).items.get(0).obj.hb.hovered=true;
公共类菜单按钮{
公共HitBox hb;
...
}
公共类名称编辑{
公共HitBox hb;
...
}
公共类卷滑道{
公共HitBox hb;
...
}
公共类保险箱{
公共布尔值悬停;
...
}
公共类对象{
公共字符串标签;
公共字符串提示;
公共对象对象;
...
}
公共类容器{
public LinkedList items=new LinkedList();
公共无效添加(对象obj){
项目。添加(obj);
}
...
}
//其他地方:
公共LinkedList容器=新建LinkedList();
...
containers.get(0).items.get(0).obj.hb.hovered=true;
归根结底,AOObject有一个obj成员,编译器无法推断它的类,因此我得到一个找不到的符号,因为Java无法在编译时检查,当设置obj时,它将有一个hb字段


非常感谢您的帮助。

您可以将类
AObject
更改为使用泛型类型作为
obj
的类型。可能是这样的:

public class AObject<T> {
    public String label;
    public String hint;
    public T obj;
    // [...]]
}
您的类
MenuButton
NameEdit
VolumeSlider
将实现此接口。然后您可以更改字段

public LinkedList<AObject> items=new LinkedList<>();
public LinkedList items=new LinkedList();

public LinkedList items=new LinkedList();

现在,您可以添加引用对象的
aoobject
对象,该对象实现了
HasHitBox
接口。这使您能够调用
getHitBox()

您可以更改类
AObject
以将泛型类型用于
obj
的类型。可能是这样的:

public class AObject<T> {
    public String label;
    public String hint;
    public T obj;
    // [...]]
}
您的类
MenuButton
NameEdit
VolumeSlider
将实现此接口。然后您可以更改字段

public LinkedList<AObject> items=new LinkedList<>();
public LinkedList items=new LinkedList();

public LinkedList items=new LinkedList();

现在,您可以添加引用对象的
aoobject
对象,该对象实现了
HasHitBox
接口。这使您能够调用
getHitBox()

这是使用泛型的选项吗?不幸的是不是。据我所知,我需要修改obj可以指向的所有类。但是,如果我错了,请告诉我,泛型不是我想到的第一件事,因为我有Golang的背景☺️@Erion您不需要修改包含的类来使用泛型。您只需要修改链接列表类。更好的是,使用Java的内置列表类,它已经做到了这一点(不要使用链表,这可能不是你想要的,链表几乎总是比数组支持的列表更糟糕)。@Erion请你的问题包括你必须显示的源代码,问题在哪里,列表在哪里,UI是如何涉及的,在哪里使用
obj
字段,以及如何访问hitbox成员
hb
@konrad rudolph感谢您的提示。不幸的是,我仍然不能完全确定泛型如何帮助我,因为我正在将赋值链接到未知的、编译器不存在的成员字段@Progman:很遗憾,我无法分享确切的源代码,因此我的代码非常通用。本质上,它归结为一个变量(objectobj),有一个hb(HitBox hb)字段,它有一个属性(hb.hovered),我想修改它
obj.hb.hovered=true它是使用泛型的选项吗?不幸的是不是。据我所知,我需要修改obj可以指向的所有类。但是,如果我错了,请告诉我,泛型不是我想到的第一件事,因为我有Golang的背景☺️@Erion您不需要修改包含的类来使用泛型。您只需要修改链接列表类。更好的是,使用Java的内置列表类,它已经做到了这一点(不要使用链表,这可能不是你想要的,链表几乎总是比数组支持的列表更糟糕)。@Erion请你的问题包括你必须显示的源代码,问题在哪里,列表在哪里,UI是如何涉及的,在哪里使用
obj
字段,以及如何访问hitbox成员
hb
@konrad rudolph感谢您的提示。不幸的是,我仍然不能完全确定泛型如何帮助我,因为我正在将赋值链接到未知的、编译器不存在的成员字段@Progman:很遗憾,我无法分享确切的源代码,因此我的代码非常通用。本质上,它归结为一个变量(objectobj),有一个hb(HitBox hb)字段,它有一个属性(hb.hovered),我想修改它
obj.hb.hovered=true