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