2012-01-09 18 views
2

で同じクラスの抽象と静的メソッドを持つことはできません、私は次のクラスを持っている:は、なぜ私は、Java

public abstract class A 
{ 
    public abstract String doSomething(String X, String Y); 
    public static String doSomething(String X, String Y){return X + Y;} 
    ... 
} 

私が持っている問題は、静的および抽象doSomething()方法は重複として衝突するように見えるということです。静的メソッドはクラスのインスタンスではなくクラスに属しているので、これはうまくいくはずだと思ったので、抽象メソッドを使ってすべてのサブクラスでメソッドを実行し、静的メソッドをヘルパーとして強制して、ファクタリングされたコード。

おそらく、私はミックスにインターフェイスを追加することができますが、同じクラスに存在する抽象メソッドと静的メソッドの何が問題なのかは分かりません。これには何が問題なのですか?

答えて

8

Javaでは、多くのコンパイラによってという警告が表示されていますが、クラス名ではなくオブジェクトインスタンスから静的メソッドを呼び出すことは妥当です(紛らわしく混乱していますが)。

System.out.println(String.valueOf(true)); // Prints "true". 
System.out.println("".valueOf(true)); // Prints "true", unfortunately. 

したがって、次の一見有効なコードを呼び出すために、これらの方法のどれか分からないでしょう:

A a = getInstanceOfConcreteSubclassOfA(); 
a.doSomething(null, null); // Compiler can't decide which method to call... 

は残念ながら、それだけで、Java言語のいくつかの醜いコーナーの一つです。

+0

わずかに明確にするために:コンパイラは、ランタイムではなく、どのメソッドを呼び出すかを把握する必要があります。 – ruakh

+0

静的メソッドをオーバーライドすることはできません。あなたはできる? –

+0

@srikanthradix:いいえ、静的メソッドはオーバーライドできません。 – maerics

1

各メソッドは、からなる署名を有する:

method name 
parameter type 
Return type 

2つの方法は、同じシグネチャを持っている場合、このエラーが発生します。

staticではありませんconstのようにメソッドの署名に干渉します。

3

抽象メソッドに特定されていません。一般的に、Javaでは、同じパラメータ型を持つ2つのメソッドを持つことはできませんが、静的型と静的型はありません。このようなもの:

public String doSomething(String X, String Y){return X + Y;} 
public static String doSomething(String X, String Y){return X + Y;} 

も違法です。

(あなたが実際のインスタンス「オン」、またはそのことについては、適切なタイプの任意の式の静的メソッドを呼び出すことが許されていることを考えるとこれは理にかなっています。コンパイラはA.staticMethod()から((A)null).staticMethod()を変換します。)

+0

それがポイントです。 – jenaiz