【问题标题】:Is there any way to declare T in constructor in Kotlin?有没有办法在 Kotlin 的构造函数中声明 T ?
【发布时间】: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() 需要Nothinga.types[0]Enum&lt;*&gt;

我想我可以通过指定* 来解决这个问题,但我无法找出正确的泛型...声明 T 以指定 T 扩展 Enum,并实现 Type 将是我的方式米思考。方法可以像这样类似,但我不能在构造函数中。使用Any 而不是* 也不起作用,因为它说Any 不会扩展Enum

这个问题可以解决吗,还是我必须在不使用泛型的情况下找到替代方法?

【问题讨论】:

    标签: java kotlin generics


    【解决方案1】:

    解决方法是在一次操作中同时执行gettypes,以便编译器知道类型匹配。我认为扩展方法应该和A 中声明的方法一样有效:

    fun <T> A<T>.getByIndex(i: Int) where T: A.Type<T>, T: Enum<T> = get(types[i])
    
    // in B's constructor
    this.data = a.getByIndex(0)
    

    我假设A&lt;T&gt;.get 返回String,所以B 中的代码是有意义的;如果依赖T,还是有问题。

    【讨论】:

    • 抱歉,我看到我的代码有误。是的 A.get() 应该返回 types[i].getData() 或者它返回空字符串。我认为你的方法会奏效。我注意到这在 Kotlin 中的 Java 中似乎很正常,下次我必须小心。谢谢
    猜你喜欢
    • 2022-01-15
    • 2015-03-08
    • 2015-10-11
    • 1970-01-01
    • 1970-01-01
    • 2014-07-09
    • 1970-01-01
    • 2013-01-18
    • 1970-01-01
    相关资源
    最近更新 更多