本文正在参加「Java主题月 - Java Debug笔记活动」,详情查看<活动链接>
提问:是否在Java中创建泛型类型的实例?
是否可以在Java中创建泛型类的实例?根据我的看到的答案,由于类型擦除的原因,所以我们不能在Java中创建泛型类的实例。但我想知道是否有人可以发现我没有考虑到的东西。
class SomeContainer<E>
{
E createContents()
{
return what???
}
}
回答1: 我不知道这是否有帮助,但是当您继承(包括匿名)泛型类时,可以通过反射获得类型信息。例如,
public abstract class Foo<E> {
public E instance;
public Foo() throws Exception {
instance = ((Class)((ParameterizedType)this.getClass().
getGenericSuperclass()).getActualTypeArguments()[0]).newInstance();
...
}
}
因此,当您使用new Foo<Bar>()子类化 Foo<E>时,您将获得Bar的instance,例如,
// 注意Foo<Bar>匿名继承了Foo<E>
assert( new Foo<Bar>() {}.instance instanceof Bar );
回答2: 在Java 8中,您可以使用Supplier功能接口轻松实现此目的:
class SomeContainer<E> {
private Supplier<E> supplier;
SomeContainer(Supplier<E> supplier) {
this.supplier = supplier;
}
E createContents() {
return supplier.get();
}
}
您可以用这种方法构造这个类
SomeContainer<String> stringContainer = new SomeContainer<>(String::new);
啥啥啥,这是个啥
Supplier代码
@FunctionalInterface
public interface Supplier<T> {
/**
* Gets a result.
*
* @return a result
*/
T get();
}
- supplier是个接口,有一个get()方法
- 语法Lambda表达式:
SomeContainer<String> stringContainer = new SomeContainer<>(String::new);
//TestSupplier::new 并不等于 new TestSupplier(),而是在lambda表达式中的一种简写()->{new TestSupplier()}
- 每次调用get()方法时都会调用构造方法创建一个新对象。
文章翻译自Stack Overflow :stackoverflow.com/questions/7…