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

如何在Java的标准类中设置泛型对象?

如何在Java的标准类中设置泛型对象?,java,object,generics,Java,Object,Generics,背景背景背景: 我有一个表示复杂3D模型的非泛型类。我还有一系列标准的3D几何类(球体、立方体、长方体),它们都继承自一个抽象类,因此所有子类都继承相同的字段和函数。因此,每个类都需要能够处理复杂的3D模型类,该类不是从抽象类继承的(它不需要相同的字段/函数) 因此,我想将所有子类与复杂模型类一起使用。具体地说,当用户需要时,一个子类可以处理复杂模型,因此只要用户需要,它就会作为字段保存到此类中。复杂类需要从这些对象访问字段和函数,因此我认为使用通用函数可以应用于所有具有相同字段/函数的简单3D

背景背景背景:

我有一个表示复杂3D模型的非泛型类。我还有一系列标准的3D几何类(球体、立方体、长方体),它们都继承自一个抽象类,因此所有子类都继承相同的字段和函数。因此,每个类都需要能够处理复杂的3D模型类,该类不是从抽象类继承的(它不需要相同的字段/函数)

因此,我想将所有子类与复杂模型类一起使用。具体地说,当用户需要时,一个子类可以处理复杂模型,因此只要用户需要,它就会作为字段保存到此类中。复杂类需要从这些对象访问字段和函数,因此我认为使用通用函数可以应用于所有具有相同字段/函数的简单3D网格类

问题

假设我有一个非泛型类,我希望该类的字段是泛型类型。我希望非泛型类能够处理各种用户创建的类型

我希望在非泛型类中有一个泛型方法,可以设置泛型字段,如下所示:

void <T> setGenericObject(T object){
    genericField = object;
}
Sample sample = new Sample();
Sample.Inner<Float> inner = sample.new Inner<>();
inner.setG(new Float(0.1));
Float g = inner.getG();
void setGenericObject(T对象){
genericField=对象;
}

但是,我不知道如何正确声明泛型字段。我不想只为它的一个小字段创建一个泛型类(因为处理其他对象只是该类功能的一小部分)。如何在类中正确声明此genericField变量以使其正常工作?

您可以将该字段声明为对象类型,并将其设置为参数。Java中的所有类都扩展了
对象
类,因此您可以将其用作泛型类型:

private Object genericObject;

public void setGenericObject(Object object) {
    this.genericObject = object;
}
然后,如果要调用不属于
对象的方法,可以使用强制转换:

public void executeMethod() {
    ((ClassName) this.genericObject).methodName();
}

但是要注意
ClassCastException
s。

一种方法是创建一个内部类:

public class Sample{
    //other functionality

    private class Inner<T>{
        T g;

        public T getG() {
            return g;
        }

        public void setG(T g) {
            this.g = g;
        }
    }
}
公共类示例{
//其他功能
私人阶级内部{
tg;
公共T getG(){
返回g;
}
公共无效设置(T g){
这个.g=g;
}
}
}
然后可以这样使用:

void <T> setGenericObject(T object){
    genericField = object;
}
Sample sample = new Sample();
Sample.Inner<Float> inner = sample.new Inner<>();
inner.setG(new Float(0.1));
Float g = inner.getG();
Sample-Sample=新样本();
Sample.Inner=Sample.new Inner();
内部设置(新浮动(0.1));
Float g=internal.getG();

虽然不能仅将字段设置为通用字段,但可以对
t
使用擦除,即
Object
。你想对这个字段做什么?这个字段会随着主类更新它的旋转。它将暂时成为3D模型的一部分,直到泛型类型被重置或更改为null。没有足够的上下文提供比“仅使用对象”更有用的内容。嗯,这可能与从泛型对象中提取方法的另一个函数相一致。如果需要泛型字段,则必须在类中使用类型参数。这就是泛型在Java中的工作方式。如果您编辑问题以包含更多关于您正在做什么的上下文(或询问一个新的上下文),那么我们可能会提供使用泛型的替代方案。(另请参见)对于语法和sintax,我很抱歉ItalainI最终使用了这个,除了使用反射来查找字段和方法之外。