假设我有一个数据类,它有三个属性:
data class Product(
val id: Int,
val name: String,
val manufacturer: String)
如果我正确理解,Kotlin将使用这三个属性生成equals()和hashCode(),如下所示:
override fun equals(other: Any?): Boolean {
if (this === other) return true
if (other == null || javaClass != other.javaClass) return f
我知道用Java编写静态泛型方法是可能的。
我试图在Kotlin实现我自己的解决方案,但失败了。
class Wrapper<T>
{
companion object <T> // error: Type parameters are not allowed for objects.
{
private var value: T? = null
// implement some methods
}
}
有没有办法在Kotlin中实现静态泛型方法?
我知道如何在Kotlin中创建类委托:
class CustomList<T>(private val data: ArrayList<T> = ArrayList<T>()) : List<T> by data
但是,我不想将数据放在构造函数中,因为我希望在创建CustomList时列表为空:
class CustomList<T> : List<T> by data {
private val data = ArrayList<T>()
}
这似乎不起作用。
如何使data成为一个内部字段,并将列
我已经创建了这个扩展方法,它从KClass<T>中获取所有属性
可拓方法
@Suppress("UNCHECKED_CAST")
inline fun <reified T : Any> KClass<T>.getProperties(): Iterable<KProperty1<T, *>> {
return members.filter { it is KProperty1<*, *> }.map { it as KProperty1<T, *> }
}
示例用法
data clas
我可以在Java中做到这一点:
public <T extends Bar & Baz> Foo(T arg) { ... }
在Foo的构造函数中,arg是类型化的,因此它扩展了Bar并实现了Baz。这是在不向Foo添加类型参数(即class Foo<T extends Bar & Baz>)的情况下完成的。如何在Kotlin中这样做呢?类似于:
constructor<T>(arg: T) where T : Bar, T : Baz { ... }
更新:我想添加更多的上下文,我在中使用匕首,它要求我这样做:
@ContributesA
假设我有下面的类,有一个类型参数T(在这个例子中,它是有界的,以帮助说明后面的例子,但当它是无界的时,错误仍然存在):
class GenericsTest<T : CharSequence>(private var cs: T)
现在假设我想要向这个类添加一个辅助构造函数。我该怎么做呢?我的第一次(幼稚的)尝试导致了一个编译器错误:
class GenericsTest<T : CharSequence>(private var cs: T)
{
// dummy exists to ensure the method signatures are diffe
我想让我的Kotlin数据类尽可能简单。它只能通过如下所示的JSONObject进行初始化: data class Foo(val json: JSONObject)
{
@JvmField val bar: String = json.getString("bar")
} 有没有办法注释这个类,这样构造函数可能会抛出一个JSONException
我用Kotlin学了一些代码,想把它翻译成Java。在Kotlin中,当创建CustomView时,我看到它们直接将ArrayList参数传递给类并扩展ArrayAdapter,如下所示: class PostClass (private val userEmail: ArrayList<String>,
private val userImage: ArrayList<String>,
private val userComment: ArrayList<String>,
有没有办法在Kotlin数据类中创建一个私有setter和一个公共getter? data class Test(var attribute: String) {
// attribute can be mutated inside this class
// but outside only readable ?
}
我正在和Kotlin一起做我的玩具项目。 在写代码的时候,我觉得这些代码有些重复,也不干净。 val a: Int = 1
val a_D: BigDecimal = a.toBigDecimal()
val b_D: BigDecimal = a.toBigDecimal() 那么,有没有办法使用优雅的方法来避免这些重复(比如toBigDecimal())呢?
假设我在Java中有这个声明,没关系。
abstract class Start<T extends End> {
public T end;
}
abstract class End<T extends Start> {
public T start;
}
但是,在Kotlin中这是不行的,因为Kotlin对“循环”类型参数有限制。
abstract class Start<T : End<*>> {
lateinit var end: T
}
abstract class End<T : Start<*
以下代码没有编译:
class C
{
private:
int m_x;
protected:
C(int t_x) : m_x(t_x) { }
};
class D : public C
{
public:
using C::C;
};
int main(int argc, char **argv)
{
D o(0);
}
编译器的反对意见是C的构造函数被声明为protected,这意味着我不能从main访问它。换句话说,using声明似乎拖着标识符的原始可见性,尽管它存在于public块中。
两
我在和Kotlin玩,我觉得有“函数类”会很棒,看看我想要的例子:
functional class MyStrFunction(val function: MyStrFunction.(String) -> String) {
val memory = HashMap<String, String>()
fun output(message: String) = println(message)
}
我的想法是我可以像:
val f = MyStrFunction {
output("reversing $it");
if
我正在使用Kotlin构建一个Android应用程序。我有一个也是单例的服务。当我在Activity中调用startService()时,我得到了以下异常:java.lang.IllegalAccessException: void com.mydomain.socket.SocketService.<init>() is not accessible from java.lang.Class<android.app.AppComponentFactory> 有没有人知道这是什么原因,以及如何使用单例服务?我之所以将其实现为单例,是因为我希望能够在我的应用程序中的任何
有没有办法在Kotlin中的数据类中嵌套枚举?
data class D(val a:Any) {
enum class E {F,G}
...
}
或者在函数中以内联方式声明它?
fun foo() {
enum class E {F,G}
doSomething()
}
我找不到关于允许在何处声明枚举的规则的文档。
通常,可以通过更改成员在类中声明的顺序来更改成员初始值设定项的运行顺序。但是,有没有办法让基类的初始化器/构造函数不先运行呢?
这是我的问题的一个最小的草图:
class SpecialA : public A {
public:
explicit SpecialA(Arg* arg)
: member(expensiveFunction(arg))
, A(member) // <-- This will run first but I don't want it to
{}
private:
T member;
}
我有一个带有val字段的数据类
@Parcelize
data class MemberCard(
val PartnerMembershipId: Int,
override var MembershipNumber: String? = null,
override var Name: String? = null,
var MemberImgUrl: String? = null,
val TextColorHex: String? = null,
override var Expiratio
我有一台WebView。我想打电话给你
public void evaluateJavascript(String script, ValueCallback<String> resultCallback)
此方法。
下面是ValueCallback接口:
public interface ValueCallback<T> {
/**
* Invoked when the value is available.
* @param value The value.
*/
public void onReceiveValue(T
从Kotlin开始,想要创建一个数据类
data class Person(val Email: String, val firstName: String, val lastName: String)
但是,假设我想添加在我使用构造函数时不知道的其他属性,但是我想在稍后知道时存储这些数据,例如一个人的情绪(表示为字符串)。
在Java中,我会创建这样一个数据类。我将能够不将它包含在构造函数中,并在以后设置它的地方做一个getter。
public class Person{
private String email;
private String firstName;
所以我有一个抽象类:
export abstract class Foo {
// Can't do this, but I want to make sure the implementation sets "name"
//abstract name: string;
set name(value: string) {
// Do things
}
}
正如我在代码中所述,我希望监听对Foo类中的属性name所做的更改,但要保持它的抽象,以确保程序员在某个地方设置/实现该属性。
有没有办法确保程序员设置这个变量,或者
当我将我的服务的构造函数方法移动到Kotlin代码时,我得到了一条"Method is never“消息。将下面的方法转移到Kotlin服务的正确方法是什么?我认为可以使用init块来代替,但我不确定。 public CurrencyServiceImpl() {
currenciesCache = Caffeine.newBuilder().maximumSize(100).expireAfterWrite(1, TimeUnit.DAYS).build();
} 现在对于Kotlin,下面抛出“函数"CurrencyServiceImpl”从未使用过“ fun C
我在抽象课上是这样做的
@Autowired
lateinit var fileContract: FileContract
有错误
kotlin.UninitializedPropertyAccessException: lateinit property fileContract has not been initialized
但这同样适用于普通班级。为什么?
这是有效的Kotlin文件:
fun <A> fourtyTwo(foo: A): Int = 42
val bar = listOf("candy", "chips", "drink").map(::fourtyTwo)
但是,在我的项目中,fourtyTwo是在(另一个文件)中定义的一个。
有没有办法从另一个文件将设置为顶级函数?
使用Kotlin的好处之一是它的零安全性。然而,当我在使用Android应用程序编程时,我发现自己需要使用null。在声明UI元素(如TextViews和按钮等)时,我需要创建私有变量,这些变量在onCreate期间被初始化到每个对象,但这意味着我需要在每个引用上显式地允许null。这种做法违背了使用Kotlin的目的之一。有没有更好的解决方案,在我的Android活动中创建UI对象的实例。
此时此刻,我就是这样做的。
var messageView: TextView? = null
var firstNameView: EditText? = null
var la