1

次のようなクラスがあります。

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でコンパイルエラーを発生させるにはどうすればよいですか?

4

11 に答える 11

9

あなたが持っている場合

void foo(String bar)
{

}

そしてあなたは電話します

foo(new FileEntry());

コンパイラエラーが発生します。こちらをご覧ください

toString()は、次のようなことをした場合にのみ呼び出されます。

foo("this is foo" + new FileEntry());
于 2011-05-25T17:32:17.977 に答える
6

コンパイル時にそれを行うことは不可能です。実行時に、オーバーライドされたtoStringメソッドから例外をスローできます

于 2011-05-25T17:30:47.957 に答える
4

呼び出しtoString()はキャストと同じではありません-違いに注意する必要があります。

オーバーライドtoString()して、例外をスローするだけでなく、非推奨にすることもできます。

@Deprecated @Override
public String toString() {
    throw new IllegalStateException("toString mustn't be called on this class");
}

これは、式のコンパイル時の型がである場合にのみ、コンパイル時に役立ちますFileEntry。また、ほとんどの構成では警告になります。

toString()これは、自動的に呼び出そうとするデバッガーなどを混乱させる可能性もあります。

于 2011-05-25T17:37:01.097 に答える
2

toString()内部で例外をオーバーライドしてスローする以外の方法は考えられません。

于 2011-05-25T17:30:34.283 に答える
1

String引数を持つメソッドでこのクラスを使用すると、JavaコンパイラはtoString()を使用してこれをStringオブジェクトに自動的に変換します。

いいえ、ありません。そのようなメソッドが存在する場合、それが行うことは、Objectパラメーターを受け取るオーバーロードされたメソッドを呼び出すことです-そしてそのようなメソッドはしばしばtoString()パラメーターを呼び出します。

オーバーロードされたメソッドが使用されるのを防ぐためにできることは何もありません-結局のところ、それらは意図的にそこに置かれました。

于 2011-05-25T17:34:12.267 に答える
1

他の人が指摘しているように"str" + obj、型キャストは含まれません。

オーバーロードやへの呼び出しは含まれませんString.concat(String)。(実際、isの場合とはstr1.concat(str2)異なる結果が得られます!)str1 + str2str2null

技術的に言えば、これは「文字列変換」と呼ばれます。JLS5.1.11を参照してください。変換は、関連するプリミティブラッパークラスの静的メソッドの呼び出しまたは呼び出しと同等です。String.valueOf(Object)toString(primitive)

于 2011-05-26T12:43:40.197 に答える
0

あなたの前提は正しくないと思います。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";
    }
}

私のJava1.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
于 2011-05-25T17:45:07.113 に答える
0

コメントで述べたように、私は正確に何が起こっているのか理解していません。ただし、FileEntry @ 6e470ce1は、おそらくFileEntryのtoStringメソッドの結果です。文字列である限り、それを上書きして、必要なものを返すことができます。

于 2011-05-25T17:33:46.197 に答える
0

toString()でメソッドを実装しない理由がわかりませんFileEntry。本当にコンパイルエラーが必要な場合は、次のような基本抽象クラスを作成できます。

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;
    }
}
于 2011-05-25T17:35:49.550 に答える
0

このObjectクラスには、toString()Javaのすべてのクラスに継承されるがあります(非常にクラスがから派生しているためObject)。これtoString()が呼び出されます(オーバーライドされない限り、その場合、その特定のオブジェクトのオーバーライドtoString()が呼び出されます)。

これを防ぐためにできることは何もありません。

別の注意点として、あなたのメソッドはどのように見えますか?持っていてpublic myMethod(String arg)、電話をかけた場合myMethod(new FileEntry())、コンパイル時エラーが発生することは間違いありません。

もちろん、Object argパラメータとして持つオーバーロードされたメソッドがある場合、それが呼び出されるメソッドです。内部的には、このメソッドはおそらくを呼び出しtoString()ていargます。また、文字列コンテキストで文字列ではないオブジェクトを使用すると(たとえば、文字列に連結した場合)、そのオブジェクトtoString()(オーバーライドされたオブジェクト、またはfromからのデフォルトObject)への暗黙の呼び出しが発生します。

からよりきれいな結果を得るには、クラスtoString()をオーバーライドtoString()して、FileEntryより意味のあるものを出力するようにする必要があります。

于 2011-05-25T17:37:33.193 に答える
-1

いつでもJavaのソースをダウンロードして、ObjectからtoString()を削除できます。

于 2011-07-26T23:18:47.980 に答える