【发布时间】:2020-12-21 08:34:26
【问题描述】:
由于缺乏我的 Kotlin 知识,我在使用构造函数时遇到了问题。我找了又找,但我只能在方法或类中使用泛型
我同时使用 java 类和 Kotlin 类。我给你举个例子
class A<T extends Enum<T> & A.Type<T>> {
interface Type<T extends Enum<T> & Type<T>> {
String getData();
}
public enum Example implements Type<Example> {
HELLO("data1"),
WORLD("data2");
public Example(String data) {
this.data = data;
}
private final String data;
@Override
public String getData() {
return data;
}
}
public enum Example2 implements Type<Example2> {
BYE("1Data"),
WORLD("2Data");
public Example2(String data) {
this.data = data;
}
private final String data;
@Override
public String getData() {
return data;
}
}
//And there are several enum classes
public final T[] types;
public A(T[] type) {
types = type;
}
public String get(T t) {
for(int i = 0; i < types.length; i++) {
if(types[i] == t) {
return types[i].getData();
}
}
return "";
}
}
不知道这个类的正确用法,因为我在写这个问题时做了它,但基本结构是这样的。我真正使用的是更复杂的东西(不是我做的),所以用这门课解释我遇到的问题会更好。所以我将能够通过调用 new A(A.Example.values()); 之类的东西来初始化 A 类
现在让我们假设我想在名为B的类的构造函数中使用这个A作为参数
class B {
var data: String = ""
val a: A<*>
constructor(a: A<*>) {
this.a = a
this.data = a.get(a.types[0]) //This is the problem
}
}
每当我尝试通过调用a.get(a.types[0]) 为默认数据设置data 时,Kotlin 都会出现问题,因为a.get() 需要Nothing 而a.types[0] 是Enum<*>
我想我可以通过指定* 来解决这个问题,但我无法找出正确的泛型...声明 T 以指定 T 扩展 Enum,并实现 Type 将是我的方式米思考。方法可以像这样类似,但我不能在构造函数中。使用Any 而不是* 也不起作用,因为它说Any 不会扩展Enum
这个问题可以解决吗,还是我必须在不使用泛型的情况下找到替代方法?
【问题讨论】: