问题描述
|
我有一堂课,看起来像下面这样:
public class FileEntry {
private String name;
public FileEntry (String name) {
this.name = name;
}
}
void foo(String arg){};
foo(\"string\" + new FileEntry(\"\")); // How to get a compile error here
如何使java给我一个编译错误,而不是自动将Object转换为String?
解决方法
如果你有
void foo(String bar)
{
}
然后你打电话
foo(new FileEntry());
将会出现编译器错误。看这里
仅当您执行类似操作时,才会调用toString()
foo(\"this is foo\" + new FileEntry());
,在编译时是不可能的。在运行时中,您可以从重写的toString方法中引发异常
,叫toString()
与强制转换不同-您需要注意不同之处。
您可以重写ѭ4不仅引发异常,而且不推荐使用:
@Deprecated @Override
public String toString() {
throw new IllegalStateException(\"toString mustn\'t be called on this class\");
}
仅当表达式的编译时类型为FileEntry
时,这才对编译时有所帮助。在大多数配置下,这也只是警告。
这也可能会使尝试自动调用toString()
的调试器产生混乱,等等。
,除了覆盖ѭ4并在其中抛出异常外,我别无选择。
, 如果我在具有
Java编译器将使用的字符串参数
自动将此转换为字符串
使用toString()的对象
不,不会。如果存在这样的方法,它将被称为带一个Object
参数的重载方法,而这种方法通常会在参数上调用toString()
。
您无法采取任何措施来防止使用重载的方法-毕竟它们是故意放置的。
,正如其他人指出的那样,“ 12”不涉及类型转换。
它既不涉及重载,也不涉及对String.concat(String)
的调用。 (实际上,当str2
是null
时,str1.concat(str2)
与str1 + str2
会得到不同的结果!)
从技术上讲,这称为“字符串转换”;参见JLS 5.1.11。该转换等效于对primitive18ѭ的调用或对相关原始包装器类的静态toString(primitive)
方法的调用。
,正如评论中提到的,我不知道到底发生了什么。但是FileEntry @ 6e470ce1可能是FileEntry的toString方法的结果。您可以覆盖该内容以返回所需的任何内容,只要它是字符串即可。
,我不确定为什么不只在FileEntry
中实现toString()
方法。如果您确实需要编译错误,则可以创建一个基本的抽象类,例如:
public abstract class ForceImplementToString {
@Override
public abstract String toString();
}
然后像这样创建您的类,它将产生一个编译错误,您必须实现toString()
方法:
public class FileEntry extends ForceImplementToString {
private String name;
public FileEntry (String name) {
this.name = name;
}
}
,Object
类具有一个toString()
,它被Java中的每个类继承(因为非常类是从Object
派生的)。 toString()
将被调用(除非被覆盖,在这种情况下,特定对象的'4ѭ将被调用)。
您无法采取任何措施来防止这种情况的发生。
另一方面,您的方法是什么样的?如果您有public myMethod(String arg)
并致电myMethod(new FileEntry())
,我很确定这会导致编译时错误。
当然,如果您有一个重载的方法,其参数为32,则将调用该方法。在内部,此方法可能在arg
上调用toString()
。另外,在字符串上下文中使用不是字符串的对象(例如,如果将其连接到字符串),将导致对该对象的toString()
的隐式调用(可以是被覆盖的对象,也可以是默认值)从Object
起)。
要从toString()
获得更漂亮的结果,您应该在FileEntry
类中覆盖toString()
,以便打印出更有意义的内容。
,我认为您的前提不正确。 Java不会自动将对象转换为字符串。这段代码:
public class Foo {
public static void main(String[] args) {
Foo foo = new Foo();
String got = \"Concatenated: \".concat(foo);
System.out.println(got);
}
public String toString() {
return \"Foo object\";
}
}
从我的Java 1.6.0_23编译器产生以下输出:
Foo.java:4: concat(java.lang.String) in java.lang.String cannot be applied to (Foo)
String got = \"Concatenated: \".concat(foo);
^
1 error
,您始终可以下载Java的源代码,然后从Object中删除toString()。