过程参数为类型

时间:2017-01-12 17:31:56

标签: java types

首先,我知道您可以使用Class<T>将Type作为参数传递。 但是,我有一个场景如下:

假设我有一个创建MyOwnType的方法(下面的代码编译):

public MyOwnType<? extends Type,? extends Type> createMyOwnType(String name, Class<? extends Type> T1, Class<? extends Type> T2)

我真正想要做的是使用Type变量T1和T2来构造MyOwnType:

MyOwnType<T1,T2>

我知道你可以直接构造MyOwnType而不使用createMyOwnType方法。但我想使用适当的工厂模式为用户构建MyOwnType +我将编写的一些约束。

我不想逐一检查所有参数,如果T1是某种类型,而T2是某种类型,那么建议MyOwnType。因为在某些情况下,我可以有很多Ts,它们都是Type的子类型。因此,我将检查T1xT2xT3xT_n组合。

因此,我的问题是有没有办法根据提供的参数(T1和T2)创建MyOwnType,类似于以下代码:

MyOwnType<T1,T2> myowntype=new MyOwnType<T1,T2>(name);

上面的代码由于Java编译器找不到符号T1,T2而不能编译。

1 个答案:

答案 0 :(得分:1)

在这种情况下,您可以使用java泛型。请参阅您的案例示例:

class Type {}

// create some classes based on Type
class Car extends Type {}
class Bike extends Type {}
class Boat extends Type {}

@Data
class MyOwnType<T1 extends Type, T2 extends Type > {
    private String name;
    private T1 field1;
    private T2 field2;
}

public class SomeClass {

    public static <T1 extends Type, T2 extends Type> MyOwnType<T1, T2> createMyOwnType(String name) {
        MyOwnType<T1, T2> result = new MyOwnType<>();
        result.setName(name);
        return result;
    }

    public static void main(String[] args) {
        MyOwnType<Car, Boat> sample1 = createMyOwnType("orange");
        Car car = sample1.getField1();
        Boat boat = sample1.getField2();

        MyOwnType<Boat, Bike> sample2 = createMyOwnType("red");

    }
}

这里不是将参数传递给工厂方法,而是在声明变量“sample1”和“sample2”时指定所需的类型。我希望这是你想要的。

但是如果你想创建真正的工厂,即在方法中使用类型,那么它是不可能的,因为Java不支持这个。你可以像我的例子那样准备课程。在Inside方法中,您只知道T1和T2扩展了Type。