【问题标题】:How to use an enum as a parameter of a function declaration within an interface?如何在接口中使用枚举作为函数声明的参数?
【发布时间】:2020-03-28 06:21:44
【问题描述】:

是否可以在接口中使用枚举作为函数声明的参数? 例如有:

class FloatingToastDialog(val messageType: FloatingToastType) {

    companion object {

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

我想在接口中声明一个将枚举作为输入参数的函数,如下所示:

interface SecurityCallbacks {

    fun showFloatingToast(message: String, msgType: FloatingToastType)

}

但编译器无法通过说导入枚举 未解决的参考:FloatingToastType

是否可以在不使用序数或其他类似的 escamotages 的情况下做到这一点?

【问题讨论】:

    标签: java kotlin enums interface


    【解决方案1】:

    如果你这样声明,你必须把它称为

    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)
    

    【讨论】:

      【解决方案2】:

      您必须以这种方式引用伴随对象内的枚举:classame.Companion.enumtype

      所以,在你的情况下,你可以这样声明接口:

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

      或者,您可以在 FloatingToastDialog 类中声明枚举,而不是在内部伴随对象中,并在接口中使用它:

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

      【讨论】:

        【解决方案3】:

        我认为您必须将类/伴随对象之外的枚举声明为包元素,这应该可以。枚举也应该在界面中。

        【讨论】:

        • 不幸的是,它也不能那样工作,并且将枚举移动到接口在逻辑上没有任何意义,它不是 SOLID
        • 通常你有依赖于接口而不是相反的具体实现,但也许你处于一个更有意义的相反方法的场景中。
        【解决方案4】:

        我来自 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());
            }
        }
        

        它给出了输出: 主要的 警报警报

        【讨论】:

          猜你喜欢
          • 2021-05-19
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 2022-12-13
          • 2011-05-30
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          相关资源
          最近更新 更多