GVKun编程网logo

无法为Kotlin声明的函数删除冗余的SAM-constructor,但可以在Java声明的函数上使用

15

本篇文章给大家谈谈无法为Kotlin声明的函数删除冗余的SAM-constructor,但可以在Java声明的函数上使用,同时本文还将给你拓展c–is_constructible和is_destruc

本篇文章给大家谈谈无法为Kotlin声明的函数删除冗余的SAM-constructor,但可以在Java声明的函数上使用,同时本文还将给你拓展c – is_constructible和is_destructible不受朋友声明的影响、c – 可以在声明的同一行上使用istream初始化一个变量吗?、C++函数声明的时候后面加const、constructor Php 构造函数construct的前下划线是双的_等相关知识,希望对各位有所帮助,不要忘了收藏本站喔。

本文目录一览:

无法为Kotlin声明的函数删除冗余的SAM-constructor,但可以在Java声明的函数上使用

无法为Kotlin声明的函数删除冗余的SAM-constructor,但可以在Java声明的函数上使用

我有一个Java类函数,如下所示

public void setPositiveButton(int resId, DialogInterface.OnClickListener listener)

我也有如下相同的Kotlin Class函数

fun setPositiveButton(resId: Int, listener: DialogInterface.OnClickListener)

当我从Kotlin代码调用它们时

    javaClassObj.setPositiveButton(R.string.some_string,            DialogInterface.OnClickListener { _, _ -> someFunc()})    kotlinClassObj.setPositiveButton(R.string.some_string,            DialogInterface.OnClickListener { _, _ -> someFunc()})

可以减少Java类函数的调用,但不能减少Kotlin类函数的调用

    javaClassObj.setPositiveButton(R.string.some_string,            { _, _ -> someFunc()})    kotlinClassObj.setPositiveButton(R.string.some_string,            DialogInterface.OnClickListener { _, _ -> someFunc()})

为什么Kotlin函数调用无法按照Java启用的方式减少冗余的SAM-Constructor?

答案1

小编典典

为什么在kotlin中使用SAM?同时具有对功能的本地支持。

SAM约定在java8中用作不具有本机功能支持的解决方法。

来自kotlin doc#sam-conversions:

请注意,SAM转换仅适用于接口,不适用于抽象类,即使它们也只有一个抽象方法。

另外,请注意,此功能仅适用于Java互操作。由于Kotlin具有适当的功能类型,因此不需要将功能自动转换为Kotlin接口的实现,因此不受支持。

然后应直接声明一个函数。

fun setPositiveButton(resId: Int, listener: (DialogInterface, Int) -> Unit) {    listener.invoke(            //DialogInterface, Int    )}

然后可以使用

setPositiveButton(1, { _, _ -> doStuff() })

在kotlin 1.4中,可以将SAM转换用于Kotlin类。

fun interface Listener {    fun listen()}fun addListener(listener: Listener) = a.listen()fun main() {    addListener {        println("Hello!")    }}

c – is_constructible和is_destructible不受朋友声明的影响

c – is_constructible和is_destructible不受朋友声明的影响

在评估std :: is_constructible和std :: is_destructible时,Clang和GCC似乎不尊重朋友声明.

关于`is_constructible,cppreference.com says:

Access checks are performed as if from a context unrelated to T and any of the types in Args. Only the validity of the immediate context of the variable deFinition is considered.

(该网站没有解释is_destructible如何处理访问检查,但访问修饰符确实会影响is_destructible的行为,因此我希望它的工作方式与is_constructible相同.)

因此,在我看来,这段代码不应该编译,因为在检查的直接上下文中,构造函数和析构函数是可用的,如局部变量实例化所证明的:

class Private
{
    Private() {}
    ~Private() {}

    friend class Friend;
};

class Friend
{
    public:
        Friend()
        {
            // Both of these should fire,but they do not.
            static_assert(
                !std::is_constructible<Private>::value,"the constructor is public");
            static_assert(
                !std::is_destructible<Private>::value,"the destructor is public");
            // There is no error here.
            Private p;
        }
};

……但是Coliru compiles it without error(使用GCC或Clang).

这是两个编译器中的错误(或至少是不合格),或者cppreference.com是否歪曲了标准,还是我误解了cppreference.com的声明?

解决方法

这正是如此

Access checks are performed as if from a context unrelated to T and
any of the types in Args.

说.根据定义,“T的朋友”不“与T无关”.

“immediate context”是一个艺术术语,但无论如何,句子是在谈论假设变量定义的直接上下文,而不是使用is_constructible.

使is_constructible检查依赖于上下文是疯狂的;这意味着相同的类型is_constructible< T,Args ...>在不同的上下文中具有不同的基类.

c – 可以在声明的同一行上使用istream初始化一个变量吗?

c – 可以在声明的同一行上使用istream初始化一个变量吗?

以下两行可以合并成一行吗?
int foo;
std::cin >> foo;

解决方法

聪明的屁股答案:
int old; std::cin >> old;

可怕的答案:

int old,dummy = (std::cin >> old,0);

正确的答案:旧的必须用声明定义,然后才能传递给运算符>>作为论据.在变量声明中获取函数调用的唯一方法是将其放在初始化表达式中,如上所述.声明变量并将输入读入的方式如下:

int old;
std::cin >> old;

C++函数声明的时候后面加const

C++函数声明的时候后面加const

非静态成员函数后面加const(加到非成员函数或静态成员后面会产生编译错误),表示成员函数隐含传入的this指针为const指针,决定了在该成员函数中,任意修改它所在的类的成员的操作都是不允许的(因为隐含了对this指针的const引用);唯一的例外是对于mutable修饰的成员。加了const的成员函数可以被非const对象和const对象调用,但不加const的成员函数只能被非const对象调用。例如: 

复制代码

1 class A { 
 2     private: int m_a; 
 3     public: 
 4         A() : m_a(0) {} 
 5          int getA() const  { 
 6              return m_a; //同return this->m_a;。
 7          } 
 8          int GetA() { 
 9              return m_a; 
10          } 
11          int setA(int a) const { 
12              m_a = a; //这里产生编译错误,如果把前面的成员定义int m_a;改为mutable int m_a;就可以编译通过。 
13          } 
14          int SetA(int a)  { 
15              m_a = a; //同this->m_a = a;
16          } 
17 }; 
18 A a1; 
19 const A a2; 
20 int t; 
21 t = a1.getA(); 
22 t = a1.GetA(); 
23 t = a2.getA(); 
24 t = a2.GetA(); //a2是const对象,

复制代码

调用非const成员函数产生编译错误。 一般对于不需修改操作的成员函数尽量声明为const成员函数,以防止产生const对象无法调用该成员函数的问题,同时保持逻辑的清晰。

constructor Php 构造函数construct的前下划线是双的_

constructor Php 构造函数construct的前下划线是双的_

定义和用法

__construct() 函数创建一个新的 SimpleXMLElement 对象。

如果成功,则该函数返回一个对象。如果失败,则返回 false。

语法

__construct(data,options,is_url,ns,is_prefix)
登录后复制
参数 描述
data 必需。形式良好的 XML 字符串或 XML 文档的路径或 URL。
options 可选。规定附加的 Libxml 参数。
is_url 可选。规定 data 参数是否是 URL。默认是 false。
ns 可选。
is_prefix 可选。

返回值

返回一个表示数据的 SimpleXMLElement 对象。

例子

<?php $xmlstring = <<<XML
<?xml version="1.0" encoding="ISO-8859-1"?><note><to>George</to><from>John</from><heading>Reminder</heading>Don''t forget the meeting!
</note>
XML;

$xml = new <code>SimpleXMLElement($xmlstring)</code>;

echo $xml-&gt;body[0];
?&gt;
登录后复制

输出类似:

Don''t forget the meeting!<br>后来看construct的前_是一个,我靠,上次也是这个错误,忘了,现在记着了 <br>function __construct() <br>{} <br>不是 <br>function _construct() <br>{} 
登录后复制

以上就介绍了constructor Php 构造函数construct的前下划线是双的_,包括了constructor方面的内容,希望对PHP教程有兴趣的朋友有所帮助。

关于无法为Kotlin声明的函数删除冗余的SAM-constructor,但可以在Java声明的函数上使用的介绍已经告一段落,感谢您的耐心阅读,如果想了解更多关于c – is_constructible和is_destructible不受朋友声明的影响、c – 可以在声明的同一行上使用istream初始化一个变量吗?、C++函数声明的时候后面加const、constructor Php 构造函数construct的前下划线是双的_的相关信息,请在本站寻找。

本文标签: