如何防止将对象自动转换为字符串。

| 我有一堂课,看起来像下面这样:
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()。     

要回复问题请先登录注册