为什么调用Constructor.newInstance()时不能使用lamda表达式?

问题描述 投票:0回答:1

我正在尝试使用 Constructor.newInstance 实例化一个对象。构造函数需要一个 DoubleSupplier 类型的参数。如果我首先创建一个 DoubleSupplier 对象,然后将该对象传递给 newInstance 方法,那么这是成功的:

DoubleSupplier  supplier    = () -> 3.0;
obj = ctor.newInstance( supplier );

但是如果我尝试直接在 newInstance 调用中使用 lamda:

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 )
        {
        }
    }
}
java lambda reflection
1个回答
1
投票

newInstance
是基于反射的。这里的输入参数属于
Object
类,它无法在不进行强制转换的情况下处理 lambda,如下所示:

obj = ctor.newInstance((DoubleSupplier) () -> 3.0 );
© www.soinside.com 2019 - 2024. All rights reserved.