我正在尝试使用
Constructor.newInstance
实例化一个对象。构造函数需要一个 DoubleSupplier
类型的参数。如果我首先创建一个 DoubleSupplier
对象,然后将该对象传递给 newInstance
方法,则成功:
DoubleSupplier supplier = () -> 3.0;
obj = ctor.newInstance( supplier );
但是如果我尝试直接在
newInstance
调用中使用 lambda:
obj = ctor.newInstance( () -> 3.0 );
它无法编译,并显示“此表达式的目标类型必须是函数式接口”。这两种方法有什么区别?
顺便说一句,我可以在使用
new
实例化对象时使用 lambda。
obj2 = new SubTypeA( () -> 3.0 );
示例程序如下。
public class CtorDemo
{
public static void main(String[] args)
{
SuperType obj = getSubType( SubTypeA.class );
System.out.println( obj.getClass().getName() );
}
private static SuperType
getSubType( Class<? extends SuperType> clazz )
{
SuperType obj = null;
try
{
Constructor<? extends SuperType> ctor =
clazz.getConstructor( DoubleSupplier.class );
DoubleSupplier supplier = () -> 3.0;
obj = ctor.newInstance( supplier );
// obj = ctor.newInstance( () -> 3.0 );
// compile error
}
catch ( NoSuchMethodException
| InvocationTargetException
| IllegalAccessException
| InstantiationException exc )
{
exc.printStackTrace();
System.exit( 1 );
}
return obj;
}
private static class SuperType
{
}
private static class SubTypeA extends SuperType
{
public SubTypeA( DoubleSupplier supplier )
{
}
}
}
newInstance
是基于反射的。这里的输入参数属于 Object
类,它无法在不进行强制转换的情况下处理 lambda,如下所示:
obj = ctor.newInstance((DoubleSupplier) () -> 3.0 );