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

时间:2018-08-09 23:02:00

标签: java object generics

背景信息:

我有一个非通用类,代表一个复杂的3D模型。我还具有一系列标准3D几何类(Sphere,Cube和Cuboid),它们都从抽象类继承,因此所有子类都继承相同的字段和函数。因此,每个类都需要能够与Complex 3D模型类一起工作,该类不会从抽象类继承(它不需要相同的字段/函数)。

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

问题

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

我想要在非泛型类中设置通用字段的泛型方法,如下所示:

void <T> setGenericObject(T object){
    genericField = object;
}

但是,我不知道如何正确地声明通用字段。我不想只为它的一个小字段创建一个通用类(因为与其他对象一起工作只是该类功能的一小部分)。我该如何在类中正确声明这个GenericField变量以使其起作用?

2 个答案:

答案 0 :(得分:2)

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

private Object genericObject;

public void setGenericObject(Object object) {
    this.genericObject = object;
}

然后,如果您想调用不属于Object的方法,则可以使用强制转换:

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

但是要注意ClassCastException

答案 1 :(得分:1)

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

public class Sample{
    //other functionality

    private class Inner<T>{
        T g;

        public T getG() {
            return g;
        }

        public void setG(T g) {
            this.g = g;
        }
    }
}

然后可以这样使用:

Sample sample = new Sample();
Sample.Inner<Float> inner = sample.new Inner<>();
inner.setG(new Float(0.1));
Float g = inner.getG();