2.0 在Java中创建泛型类的实例| Java Debug 笔记

217 阅读1分钟

本文正在参加「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();
}
  1. supplier是个接口,有一个get()方法
  2. 语法Lambda表达式:
SomeContainer<String> stringContainer = new SomeContainer<>(String::new);
//TestSupplier::new 并不等于 new TestSupplier(),而是在lambda表达式中的一种简写()->{new TestSupplier()}
  1. 每次调用get()方法时都会调用构造方法创建一个新对象。

文章翻译自Stack Overflow :stackoverflow.com/questions/7…