Java 关闭资源文件的泛型方法

Java 关闭资源文件的泛型方法,java,generics,Java,Generics,我有游标、inputstreams和outputstreams,它们不是对每个游标执行.close(),而是对它们调用一个关闭它们的方法 我试过这样的方法: private static void closeResource ( Object<T> item ) { try { if ( item != null ) { item.close();

我有游标、inputstreams和outputstreams,它们不是对每个游标执行.close(),而是对它们调用一个关闭它们的方法

我试过这样的方法:

private static void closeResource ( Object<T>  item )
    {
        try
        {
            if ( item != null )
            {
                item.close();
            }
        }
        catch ( Exception e )
        {
            throw new RuntimeException( e );
        }
    }
私有静态资源(对象项)
{
尝试
{
如果(项!=null)
{
item.close();
}
}
捕获(例外e)
{
抛出新的运行时异常(e);
}
}
它不起作用。。对象不是泛型的

所有流媒体类(
InputStream
OutputStream
和friends)都实现了接口(实际上定义了它们都实现的
.close()
方法),因此您可以执行以下操作:

private static void closeResource (Closable item ) { .. }
  • 对象
    不是泛型类型,因此不能使用
    对象
  • 对象
    类中没有定义
    close
    方法
  • 面向泛型的解决方案是使用绑定到
    Closeable
    接口的类型参数定义一个,该接口声明
    close
    方法:

    private static <T extends Closeable> void closeResource ( T  item )
    {
        try
        {
            if ( item != null )
            {
                item.close();
            }
        }
        catch ( Exception e )
        {
            throw new RuntimeException( e );
        }
    }
    
    私有静态无效关闭资源(T项)
    {
    尝试
    {
    如果(项!=null)
    {
    item.close();
    }
    }
    捕获(例外e)
    {
    抛出新的运行时异常(e);
    }
    }
    
    此代码几乎没有问题。首先,
    Object
    没有类型参数,因此
    Object
    是无效语法(除非您定义了自己的
    Object
    类型,在这种情况下,向我们显示该类)。接下来,不在任何地方声明泛型类型
    t
    。第三,JDK中的
    Object
    类没有
    close()
    方法,因此您需要更详细地了解您想要做的事情,不需要是泛型方法,实际上:)是的,只是根据标题突出显示正确的方式。谢谢!但为了做到这一点,如果我是正确的,我必须实现AutoCloseable,并且它需要Android中的API 19(而我的min定义为9)。有什么方法可以克服这个问题吗?@BVtp从JDK1.5开始就存在了。对不起,你是对的。但是我的应用程序现在崩溃了。。致命异常:AsyncTask#1 java.lang.RuntimeException:执行doInBackground()时发生错误,原因是:java.lang.CompatibleClassChangeError:接口未实现不是可关闭的父级
    AutoCloseable
    ?是的,
    AutoCloseable
    是可关闭的超级接口。