Как использовать enum в качестве параметра объявления функции в интерфейсе? - PullRequest
3 голосов
/ 28 марта 2020

Можно ли использовать перечисление в качестве параметра объявления функции в интерфейсе? Например, есть:

class FloatingToastDialog(val messageType: FloatingToastType) {

    companion object {

        enum class FloatingToastType { Alert, Warning, Error }
    }        
    ...
}

Я хотел бы объявить в интерфейсе функцию, которая принимает перечисление в качестве входного параметра, например так:

interface SecurityCallbacks {

    fun showFloatingToast(message: String, msgType: FloatingToastType)

}

, но компилятор не может импортировать перечисление говоря неразрешенную ссылку: FloatingToastType

Возможно ли это сделать без использования ординалов или других подобных операций?

Ответы [ 4 ]

2 голосов
/ 28 марта 2020

Вы должны ссылаться на enum внутри объекта-компаньона следующим образом: classame.Companion.enumtype

, поэтому в вашем случае вы можете объявить интерфейс следующим образом:

interface SecurityCallbacks {
    fun showFloatingToast(message: String, msgType: FloatingToastDialog.Companion.FloatingToastType)
}

Альтернативно вы можете объявить enum внутри класса FloatingToastDialog, а не во внутреннем сопутствующем объекте, и использовать его в интерфейсе так:

interface SecurityCallbacks {
        fun showFloatingToast(message: String, msgType: FloatingToastDialog.FloatingToastType)
    } 
2 голосов
/ 28 марта 2020

Если вы объявляете это таким образом, вы должны ссылаться на него как

fun showFloatingToast(message: String, msgType: FloatingToastDialog.Companion.FloatingToastType)

или

import FloatingToastDialog.Companion.FloatingToastType
...

fun showFloatingToast(message: String, msgType: FloatingToastType)

Вы можете объявить его внутри класса и удалить Companion:

class FloatingToastDialog(val messageType: FloatingToastType) {

    enum class FloatingToastType { Alert, Warning, Error }
    ...
}


fun showFloatingToast(message: String, msgType: FloatingToastDialog.FloatingToastType)
1 голос
/ 28 марта 2020

Я думаю, что вы должны объявить enum вне объекта class / companion как элемент пакета, который должен работать. Также перечисление должно быть в интерфейсе.

0 голосов
/ 28 марта 2020

Я из C# фона, но я думаю, что это будет полезно для вас. Я могу сделать это следующим образом. Если я пропустил что-либо (или мне нужно сказать java решение), не стесняйтесь указывать.

using System;

public enum FloatingToastType {
    Alert, 
    Warning, 
    Error
}

interface SecurityCallbacks {
    void showFloatingToast(String message, FloatingToastType msgType);
}

public class Program
{
    public static void Main()
    {
        Console.WriteLine("Main");
        FloatingToastDialog obj = new FloatingToastDialog();
        obj.showFloatingToast("Alert", FloatingToastType.Alert);
    }

}
class FloatingToastDialog : SecurityCallbacks
{
    public void showFloatingToast(String message, FloatingToastType messageType) 
    {
        Console.WriteLine(message + " " + messageType.ToString());
    }
}

Это дает вывод: Главное оповещение

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...