【问题标题】:Why toString is not called for functions parameter?为什么函数参数不调用 toString?
【发布时间】:2015-08-04 11:33:52
【问题描述】:

我有和 Enum 用于我的意图 Extras 我喜欢在我的 android 应用程序中使用。 类型定义是这样写的:

public enum Extras { TITLE, ID_USER } // ... and some more Extras

在我的代码中,我喜欢这样使用枚举:

Intent i = new Intent(); 
i.putExtra( Extras.TITLE  , "My Title String");
i.putExtra( Extras.ID_USER, 5);

 String title = i.getStringExtra(Extras.TITLE);
 int userId   = i.getIntExtra(Extras.ID_USER, -1);

我知道枚举有一个 toString 方法,我的枚举 Extras.TITLE 应该自动转换为字符串 "TITLE"

如果我像这样打印到屏幕上它甚至可以工作

System.out.println("Extra="+Extras.TITLE); 

但是对于 Intent 方法,我收到错误消息:

The method putExtra(String, CharSequence) in the type Intent is not applicable for the arguments (Extras, CharSequence)

如果像这样手动将枚举转换为字符串,我可以避免这个错误:

i.putExtra( Extras.TITLE.name()  , "My Title String");
i.putExtra( Extras.TITLE.toString()  , "My Title String");

但我想知道为什么当我将枚举作为参数传递给此方法时,为什么不会自动调用 String ?

有没有办法在不调用 toString() 的情况下传递我的枚举?

更新: 我试图改变我的 Enum 来实现 CharSequence 接口。 在此修改之后,我可以将我的枚举传递给需要 CharSequence 参数的方法。 但它仍然与 String 方法不兼容。

public static enum Extras implements CharSequence { TITLE, ID_USER; // ... and some more Extras

    @Override  public char charAt( int index )                       { return this.toString().charAt(index);           }
    @Override  public int length()                                   { return this.toString().length();                }
    @Override  public CharSequence subSequence( int start, int end ) { return this.toString().subSequence(start, end); }
}

【问题讨论】:

  • "我知道枚举有一个 toString 方法,我的 Enum Extras.TITLE 应该被自动转换为字符串 "TITLE"" - 你希望它如何自动发生?您希望使用哪种 Java 语言规则来执行此操作?这里没有字符串连接,就是自动调用toString...
  • 除了原语之外的所有东西都有一个 toString() 方法。请注意,这里没有进行强制转换:它只是一个提供字符串表示的方法调用。
  • 如果您真的非常讨厌输入 .toString(),请通过前缀 ""+ 使用自动转换
  • 我不明白的一点是,为什么当我的 Enum 传递给一个需要 String 参数的函数时,不会自动调用 toString。

标签: java tostring charsequence


【解决方案1】:

不,Enums 中的 JavaInteger 值。如果不调用 toString() 方法,则无法获取 String 值。请参阅herehere 了解更多信息。

【讨论】:

  • 我已经看过这两个帖子,但它们没有帮助。我想知道为什么当我将 toString 打印到屏幕时会自动调用它,但当我将 Enum 传递给函数时却不会。
  • @Radon8472 它不会自动调用。有一个Object 版本,它响应Integer,并且在该方法的代码中他们手动调用.toString
猜你喜欢
  • 1970-01-01
  • 2015-09-16
  • 1970-01-01
  • 2011-08-13
  • 2021-11-06
  • 1970-01-01
  • 1970-01-01
  • 2016-12-03
  • 2019-09-02
相关资源
最近更新 更多