如何创建参数化界面的实例

时间:2015-10-04 22:38:52

标签: java generics

我有这段代码:

public class ObjProcessor {
   public <OP extends PersistentObj) void process(Class<OP> objClazz, OP object, Modifier<OP> modifier) {
     ...
   }
}
public interface Modifier<T> {
    void modify(T obj);
}

和班级:

processor.process(myObj.getClass(), myObj, ???);

我被困住了。如何创建Modifier实例以便能够调用:

 Modifier<MyClass> mod = new Modifier<MyClass>() {
    @Override
    public void modify(MyClass obj) {
       // empty
    }
}; 

proc.process(myObj.getClass(), myObj, mod); // compilation error!

在Ron C的评论之后,我创建了这个修饰符:

The method process(Class<OP>, OP, Modifier<OP>) in the type ObjProcessor is not applicable for the arguments (Class< capture#1-of ? extends MyClass>, MyClass, Modifier<MyClass>)

Eclipse给出了这个错误:

FOR %%P IN (%input%\*.M3U) DO (
    echo Processing playlist "%%P"

    SETLOCAL ENABLEDELAYEDEXPANSION
    FOR /F "tokens=*" %%L IN ('type "%%P"') DO (
      SET PL=%%~pP%%L
      echo  Processing reference "!PL!"
    )
  ENDLOCAL
)

1 个答案:

答案 0 :(得分:0)

您可以创建匿名内部类作为Modifier界面的实例:

processor.process(myObj.getClass(), myObj, new Modifier<MyClass>() {

    @Override
    public void modify(MyClass obj) {
        //Add implementation here
    }
});

如果您正在使用java 8,则还可以使用lambada expressions。由于您的interface被视为功能界面(只有一种方法的界面),因此您可以使用lambada表达式而不是创建匿名类:

processor.process(myObj.getClass(), myObj, obj -> {
    //Add implementation here
});

对于第二个问题,解决方案是将流程声明更改为:

public <OP extends ObjProcessor> void process(Class<? extends OP> objClazz, OP object, Modifier<OP> modifier) {

}

我已将Class<OP>替换为Class<? extends OP>。较旧的decleration仅适用于:MyClass.class,但不适用于:instanceOfMyClass.getClass()

原因是Class<OP>类型参数不能接受Class<ClassExtendsOP>作为参数,它只允许一个类。

如果您使用MyClass作为OP, 当您使用MyClass.class时,您始终会获得Class<MyClass>个对象。但是当您使用instanceOfMyClass.getClass()时,您可以获得Class<ClassExtendsMyClass>,这与参数类型不匹配。