Java泛型类型实例化

Java泛型类型实例化,java,generics,generic-programming,Java,Generics,Generic Programming,像这样的问题很多,但似乎没有一个能具体回答我的问题 如何实例化一个新的T 我有一个泛型方法,我需要在type参数中返回类型的新实例。 这是我的密码 class MyClass { public static MyClass fromInputStream( InputStream input ) throws IOException { // do some stuff, and return a new MyClass. } } 然后在一个单独的类中,我有一个像这样的泛

像这样的问题很多,但似乎没有一个能具体回答我的问题

如何实例化一个新的T

我有一个泛型方法,我需要在type参数中返回类型的新实例。 这是我的密码

class MyClass {

  public static MyClass fromInputStream( InputStream input ) throws IOException {

    // do some stuff, and return a new MyClass.

  }
}
然后在一个单独的类中,我有一个像这样的泛型方法

class SomeOtherClass {

  public <T extends MyClass>download(URL url) throws IOException {

    URLConnection conn = url.openConnection();

    return T.fromInputStream( conn.getInputStream() );

  }
}

如有任何建议,将不胜感激

我认为一种常见的方法是要求像这样传入T类型的类:

class SomeOtherClass {

  public <T extends MyClass> T download(Class<T> clazz, URL url) throws IOException {

    URLConnection conn = url.openConnection();

    return clazz.getConstructor(InputStream.class).newInstance(conn.getInputStream() ); // Note my MyClass constructor takes an InputStream...

  }
}
class-SomeOtherClass{
公共T下载(类clazz,URL)引发IOException{
URLConnection conn=url.openConnection();
return clazz.getConstructor(InputStream.class).newInstance(conn.getInputStream());//注意我的MyClass构造函数接受一个InputStream。。。
}
}

您不需要在这里使用参数来调用方法。因为您有静态方法,可以直接从MyClass访问fromInputStream方法,我的意思是:

return MyClass.fromInputStream( conn.getInputStream() );

希望它能帮助您

除了传入一个
对象并像中一样使用反射之外,您还可以使用通用工厂:

public abstract class InputStreamFactory<T> {

    public T make(InputStream inputStream) throws IOException;
}
每个
MyClass
派生都可以提供自己的工厂实现:

public class MySubClass extends MyClass {

    public static final InputStreamFactory<MySubClass> FACTORY =
            new InputStreamFactory<MySubClass>() {
                @Override
                public MySubClass make(InputStream inputStream) throws IOException {
                    return new MySubClass(inputStream); //assuming this constructor exists
                }
            };
}

我应该更具体一点,我需要返回的类是从MyClass继承的任何类,所以返回MyClass.fromIn。。。不会返回正确的类,我希望fromInputStream方法被超类、that或构造函数重写。同意,这可能是更易于维护和更合适的解决方案。
public abstract class InputStreamFactory<T> {

    public T make(InputStream inputStream) throws IOException;
}
public <T extends MyClass> T download(URL url, InputStreamFactory<? extends T> factory) throws IOException {

    URLConnection conn = url.openConnection();

    return factory.make(conn.getInputStream());
}
public class MySubClass extends MyClass {

    public static final InputStreamFactory<MySubClass> FACTORY =
            new InputStreamFactory<MySubClass>() {
                @Override
                public MySubClass make(InputStream inputStream) throws IOException {
                    return new MySubClass(inputStream); //assuming this constructor exists
                }
            };
}
MySubClass downloaded = new SomeOtherClass().download(url, MySubClass.FACTORY);