SORU
24 HAZİRAN 2010, PERŞEMBE


Bu geçerli bir Java.

Bu geçerli bir Java.

import java.util.Arrays;
import java.util.List;

class TestWillThatCompile {

    public static String f(List<String> list) {
        System.out.println("strings");
        return null;
    }

    public static Integer f(List<Integer> list) {
        System.out.println("numbers");
        return null;
    }

    public static void main(String[] args) {
        f(Arrays.asList("asdf"));
        f(Arrays.asList(123));
    }

}
  • 3.5 diyor tutulmasıEvet
  • 3.6 diyor tutulmasıhayır
  • Aracı 9 diyorEvet
  • Güneş javac 1.6.0_20 diyorEvet
  • GCJ 4.4.3 diyorEvet
  • GWT derleyicisi diyorEvet
  • Benim de kalabalık previous Stackoverflow question diyorhayır

Java teorisi benim anlayış olduğunu söylüyorhayır!

the JLS hakkında ne söylediğini bilmek ilginç olurdu.

CEVAP
24 HAZİRAN 2010, PERŞEMBE


Bu yöntemler aramak istediğiniz nasıl bağlıdır. Bu yöntemler aramak istersenizdiğer Java kaynak koduo zaman geçersiz sayılır nedenleri Edwin's answer resimli. Bu Java Dilinin bir sınırlama var.

Ancak, tüm sınıflar Java kaynak kodu (kendi olarak JVM kullanan tüm diller düşünün zamanı: JRuby, Jython, vb.) elde edilmesi gerekir.Bayt düzeyinde, JVM bayt kodu çünkü iki yöntem belirsizliği ortadan kaldırmak olabilir talimatları belirtindönüş türü vardırbekliyorlar. Örneğin, burada bu yöntemlerden Ara bir sınıf Jasmin yazılan:

.class public CallAmbiguousMethod
.super java/lang/Object

.method public static main([Ljava/lang/String;)V
  .limit stack 3
  .limit locals 1

  ; Call the method that returns String
  aconst_null
  invokestatic   TestWillThatCompile/f(Ljava/util/List;)Ljava/lang/String;

  ; Call the method that returns Integer
  aconst_null
  invokestatic   TestWillThatCompile/f(Ljava/util/List;)Ljava/lang/Integer;

  return

.end method

Ben bir sınıf dosyası aşağıdaki komutu kullanarak derleme:

java -jar jasmin.jar CallAmbiguousMethod.j

Ve bunu kullanarak arama:

java CallAmbiguousMethod

İşte, çıkış:

> java CallAmbiguousMethod
strings
numbers

Güncelleme

Simon bu yöntemler çağıran an example program gönderildi

import java.util.Arrays;
import java.util.List;

class RealyCompilesAndRunsFine {

    public static String f(List<String> list) {
        return list.get(0);
    }

    public static Integer f(List<Integer> list) {
        return list.get(0);
    }

    public static void main(String[] args) {
        final String string = f(Arrays.asList("asdf"));
        final Integer integer = f(Arrays.asList(123));
        System.out.println(string);
        System.out.println(integer);
    }

}

Burada Java bayt kodu oluşturulur:

>javap -c RealyCompilesAndRunsFine
Compiled from "RealyCompilesAndRunsFine.java"
class RealyCompilesAndRunsFine extends java.lang.Object{
RealyCompilesAndRunsFine();
  Code:
   0:   aload_0
   1:   invokespecial   #1; //Method java/lang/Object."":()V
   4:   return

public static java.lang.String f(java.util.List);
  Code:
   0:   aload_0
   1:   iconst_0
   2:   invokeinterface #2,  2; //InterfaceMethod java/util/List.get:(I)Ljava/lang/Object;
   7:   checkcast       #3; //class java/lang/String
   10:  areturn

public static java.lang.Integer f(java.util.List);
  Code:
   0:   aload_0
   1:   iconst_0
   2:   invokeinterface #2,  2; //InterfaceMethod java/util/List.get:(I)Ljava/lang/Object;
   7:   checkcast       #4; //class java/lang/Integer
   10:  areturn

public static void main(java.lang.String[]);
  Code:
   0:   iconst_1
   1:   anewarray       #3; //class java/lang/String
   4:   dup
   5:   iconst_0
   6:   ldc     #5; //String asdf
   8:   aastore
   9:   invokestatic    #6; //Method java/util/Arrays.asList:([Ljava/lang/Object;)Ljava/util/List;
   12:  invokestatic    #7; //Method f:(Ljava/util/List;)Ljava/lang/String;
   15:  astore_1
   16:  iconst_1
   17:  anewarray       #4; //class java/lang/Integer
   20:  dup
   21:  iconst_0
   22:  bipush  123
   24:  invokestatic    #8; //Method java/lang/Integer.valueOf:(I)Ljava/lang/Integer;
   27:  aastore
   28:  invokestatic    #6; //Method java/util/Arrays.asList:([Ljava/lang/Object;)Ljava/util/List;
   31:  invokestatic    #9; //Method f:(Ljava/util/List;)Ljava/lang/Integer;
   34:  astore_2
   35:  getstatic       #10; //Field java/lang/System.out:Ljava/io/PrintStream;
   38:  aload_1
   39:  invokevirtual   #11; //Method java/io/PrintStream.println:(Ljava/lang/String;)V
   42:  getstatic       #10; //Field java/lang/System.out:Ljava/io/PrintStream;
   45:  aload_2
   46:  invokevirtual   #12; //Method java/io/PrintStream.println:(Ljava/lang/Object;)V
   49:  return

Güneş derleyici bayt kodu gerekli yöntemleri (son yöntem talimatları 12 ve 31) belirsizliği ortadan kaldırmak için üretiyor çıkıyor.

Güncelleme #2

Java Language Specification Bu, aslında, geçerli bir Java kaynak kodu olabilir. Sayfa 449 (§15.12 Yöntem Çağırma İfadeleri görüyoruz:

Hayır iki yöntem vardır, çünkü daha özeldir, bu mümkün ya da değil mi daha yöntemleri sonuna kadar özel. Bu durumda:

  • Eğer sonuna kadar belirli yöntemleri geçersiz eşdeğer (madde 8.4.2) imza varsa, sonra da:
    • Eğer sonuna kadar belirli yöntemlerin tam bir özet beyan,değilse en özel yöntemdir.
    • Her seviyede belirli yöntemler soyut bildirilir aksi halde, maksimum verim için özel yöntemleri tüm imzaları aynı silme (madde 4.6),sonra en belirgin yöntem keyfi olarak seçilir maksimum alt özel yöntemler en özel var dönüş türü vardır. Ancak, en belirgin yöntem bir atış kabul edilir eğer bu özel durum veya silme bildirilirse, yalnızca özel durum kontrol ve maksimum özel yöntemlerin her birinin maddeleri atar.
  • Aksi halde, yöntem çağırma belirsiz olduğunu söylüyorlar, ve bir derleme hata oluşur.

Yanılmıyorsam, bu davranış, yalnızca yöntemleri özet olarak ilan edilmiş olsa da geçerlidir

Güncelleme #3

İLMTitan yorum için teşekkürler

@Adem Paynter: kalın metin yok bir durumdur çünkü sadece önemli değil, iki yöntem zaman Dan gösterdi geçersiz kılar eşdeğer, durum böyle değildi. Böylece, belirleyici faktör İDEA olması gerekir hesap yaparken genel bir tür alır en spesifik yöntem belirleme. – İLMTitan

Bunu Paylaş:
  • Google+
  • E-Posta
Etiketler:

YORUMLAR

SPONSOR VİDEO

Rastgele Yazarlar

  • Fraser Raft

    Fraser Raft

    9 Mart 2010
  • Mr_BrettHooge

    Mr_BrettHoog

    3 Ocak 2011
  • TheScorpioTechno

    TheScorpioTe

    15 Aralık 2010