如何在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
,除非您知道您将添加更多功能。但是在这种情况下,have
CustomFilter
实现
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。如果必须复制所有方法,可能在某个地方存在问题。您可以拥有一个包含过滤器的类(请参见编辑的答案),并尽可能长时间地沿着函数移动过滤器。但是,当您想要实际使用过滤器时,必须为每种类型设置一个案例。