如何在Java中使用泛型将两个接口用作参数?
我试图将两个接口封装在一个接口中,这样就不必使用每个接口重写每个方法。我搜索了很多,但我不知道如何才能做到这一点:如何在Java中使用泛型将两个接口用作参数?,java,generics,interface,Java,Generics,Interface,我试图将两个接口封装在一个接口中,这样就不必使用每个接口重写每个方法。我搜索了很多,但我不知道如何才能做到这一点: class ApplyFilter { public static File[] filter (File directory, FileFilterORFilenameFilter filterWrapper) { return directory.listenFiles(filterWrapper); } } 我尝试创建一个实现两个接口的类,但是我需要
class ApplyFilter
{
public static File[] filter (File directory, FileFilterORFilenameFilter filterWrapper)
{
return directory.listenFiles(filterWrapper);
}
}
我尝试创建一个实现两个接口的类,但是我需要强制转换变量。我还尝试使用如下类使用java泛型:
public class CustomFilter<T>
{
/* Where we store our filter */
private T filter = null;
/* The method to return it */
public T getFilter ()
{
return filter;
}
/* The constructor to define the filter */
public CustomFilter (T filt)
{
if ( !(filt instanceof FileFilter) || !(filt instanceof FilenameFilter) ) throw new IllegalArgumentException("The argument must be an instance of FilenameFilter or a FileFilter.");
this.filter = filt;
}
}
public class CustomFilter<T extends FileFilter>
{
/* Where we store our filter */
private T filter = null;
/* The method to return it */
public T getFilter () {
return filter;
}
/* The constructor to define the filter */
public CustomFilter (T filt) {
this.filter = Objects.requireNonNull(filt, "filt");
}
}
提前感谢。您可以像java库本身一样处理
File.listFiles
即使用相同名称和不同参数类型的两个函数
class ApplyFilter {
public static File[] filter(File directory, FileFilter filter) {
return directory.listFiles(filter);
}
public static File[] filter(File directory, FilenameFilter filter) {
return directory.listFiles(filter);
}
}
示例holder类,请参见注释
您可以像java库本身对
File.listFiles
所做的那样,即使用相同名称和不同参数类型的两个函数
class ApplyFilter {
public static File[] filter(File directory, FileFilter filter) {
return directory.listFiles(filter);
}
public static File[] filter(File directory, FilenameFilter filter) {
return directory.listFiles(filter);
}
}
示例holder类,请参见注释
它不起作用,因为您忽略了编译器最重要的部分,以便它编译:
public static File[] filter (File directory, CustomFilter filterWrapper)
{
return directory.listenFiles(filterWrapper.getFilter());
}
实际的类型表示为:
public static File[] filter (File directory, CustomFilter<Object> filterWrapper)
{
return directory.listenFiles(filterWrapper.getFilter());
}
如果您确定总是使用
FileFilter
,您可能不应该使用CustomFilter
,而是坚持使用FileFilter
,除非您知道您将添加更多功能。但是在这种情况下,haveCustomFilter
实现FileFilter
它不起作用,因为您省略了编译器最重要的部分,因此它可以编译:
public static File[] filter (File directory, CustomFilter filterWrapper)
{
return directory.listenFiles(filterWrapper.getFilter());
}
实际的类型表示为:
public static File[] filter (File directory, CustomFilter<Object> filterWrapper)
{
return directory.listenFiles(filterWrapper.getFilter());
}
如果您确定总是使用
FileFilter
,您可能不应该使用CustomFilter
,而是坚持使用FileFilter
,除非您知道您将添加更多功能。但是在这种情况下,让CustomFilter
实现FileFilter
到底什么不起作用?它会导致编译错误还是什么?到底是什么不起作用?它会导致编译错误还是什么?所以没有解决方案来实现这两个问题?我尝试使用CustomFilter
,但在listenfile(filter.getfilter())
中,我需要强制转换返回值。我认为唯一的解决办法是对所有方法进行硬编码。如果没有“清晰”的名称,例如getFilenameFilter()
返回FilenameFilter
,或者getFileFilter()
返回FileFilter
,则不需要。但是,您可以将FilenameFilter
调整为FileFilter
,因为它基本上与使用新文件(dir,name)
作为参数调用FileFilter::accept
相同。所以没有解决方案同时实现这两个功能?我尝试使用CustomFilter
,但在listenfile(filter.getfilter())
中,我需要强制转换返回值。我认为唯一的解决办法是对所有方法进行硬编码。如果没有“清晰”的名称,例如getFilenameFilter()
返回FilenameFilter
,或者getFileFilter()
返回FileFilter
,则不需要。但是,您可以将FilenameFilter
调整为FileFilter
,因为它基本上与调用FileFilter::accept
和newfile(dir,name)
作为参数是一样的。这不是我想要做的,但似乎这是唯一的方法。我不喜欢对所有方法进行harcoding,因为方法的数量将乘以x2。如果必须复制所有方法,可能在某个地方存在问题。您可以拥有一个包含过滤器的类(请参见编辑的答案),并尽可能长时间地沿着函数移动过滤器。但是当你想实际使用过滤器时,你必须为每种类型都有一个案例。这不是我想做的,但似乎这是唯一的方法。我不喜欢对所有方法进行harcoding,因为方法的数量将乘以x2。如果必须复制所有方法,可能在某个地方存在问题。您可以拥有一个包含过滤器的类(请参见编辑的答案),并尽可能长时间地沿着函数移动过滤器。但是,当您想要实际使用过滤器时,必须为每种类型设置一个案例。