使用 Java 反射和泛型:方法可以将实际类型指定为其 return 值吗?
Using Java reflection and generics: can a method specify an actual type as its return value?
我有一个 class 维护 Baz 类型对象的列表。但是,我想在此列表中放置一些对象,这些对象是从 Baz 类型的子 classes 实例化的(用于覆盖行为)。
到目前为止,这已经很简单了 -- 列表中的多态性。但是维护列表的class本身是抽象的,不同的实现会要求在列表中放置不同的类型。一些抽象函数 getTypeToUse 应该指定要插入到列表中的元素的类型。这在 Java 中可行吗?
考虑以下伪代码:
public abstract class Foo {
public void Bar() {
List<Baz> qux = new ArrayList<>();
Type buzz = getTypeToUse();
Baz fizz = new buzz();
qux.add(fizz);
}
// The returned Type should be some subclass of Baz
// It would be nice to enforce this, like <? extends Baz>
public abstract Type getTypeToUse();
}
谢谢!
您可以 return class 对象。 class Class<T>
实现接口 Type
。像这样定义你的方法:
public abstract Class<? extends Baz> getClassToUse();
然后像这样实现它(在class Baz):
@Override
public Class<? extends Baz> getClassToUse() {
return Baz.class;
}
我有一个 class 维护 Baz 类型对象的列表。但是,我想在此列表中放置一些对象,这些对象是从 Baz 类型的子 classes 实例化的(用于覆盖行为)。
到目前为止,这已经很简单了 -- 列表中的多态性。但是维护列表的class本身是抽象的,不同的实现会要求在列表中放置不同的类型。一些抽象函数 getTypeToUse 应该指定要插入到列表中的元素的类型。这在 Java 中可行吗?
考虑以下伪代码:
public abstract class Foo {
public void Bar() {
List<Baz> qux = new ArrayList<>();
Type buzz = getTypeToUse();
Baz fizz = new buzz();
qux.add(fizz);
}
// The returned Type should be some subclass of Baz
// It would be nice to enforce this, like <? extends Baz>
public abstract Type getTypeToUse();
}
谢谢!
您可以 return class 对象。 class Class<T>
实现接口 Type
。像这样定义你的方法:
public abstract Class<? extends Baz> getClassToUse();
然后像这样实现它(在class Baz):
@Override
public Class<? extends Baz> getClassToUse() {
return Baz.class;
}