2011-05-19 31 views
5

aşırı fonksiyonlar compute1(), compute2() ve compute5() neden derleme hatası bunları aşağıda kullanmaya çalışırsanız:Java: derleme zamanı çözünürlük ve "en özel yöntem"

package com.example.test.reflect; 

class JLS15Test2 
{ 
    int compute1(Object o1, Integer i, Integer j)   { return 1; } 
    int compute1(String s1, Integer i, int j)    { return 2; } 

    int compute2(Object o1, Integer i, int j)    { return 3; } 
    int compute2(String s1, Integer i, Integer j)   { return 4; } 

    int compute3(Object o1, Integer i, int j)    { return 5; } 
    int compute3(String s1, Integer i, int j)    { return 6; } 

    int compute4(Object o1, Integer i, Integer j)   { return 7; } 
    int compute4(String s1, Integer i, Integer j)   { return 8; } 

    int compute5(Object o1, Integer i, Object j)   { return 9; } 
    int compute5(String s1, Integer i, int j)    { return 10; } 


    public static void main(String[] args) 
    { 
     JLS15Test2 y = new JLS15Test2(); 

     // won't compile: 
     // The method compute1(Object, Integer, Integer) is ambiguous 
     // for the type JLS15Test2 
     // System.out.println(y.compute1("hi", 1, 1)); 

     // Neither will this (same reason) 
     // System.out.println(y.compute2("hi", 1, 1)); 
     System.out.println(y.compute3("hi", 1, 1)); 
     System.out.println(y.compute4("hi", 1, 1)); 

     // neither will this (same reason) 
     // System.out.println(y.compute5("hi", 1, 1)); 
    } 
} 

JLS bölümü 15.12 okuduktan sonra "En spesifik yöntem" belirlerken, aşırı yüklenen yöntemlerin eşleştirilmesinde 2. aşamada (kutulama/kutucunun izin verilmiş olması, varargs olmaması) JLS, en spesifik yöntemin resmi parametreleri olan yöntem olduğunu anladığımı düşünüyorum uygulanabilir diğer yöntemlerin alt türleridir ve ilkel ve Nesneler (örn. int ve Integer) asla birbirinin alt türleri değildir. Yani IntegerInteger bir alt-tipidir ve intint bir alt tipi olan, ancak Integer ve int/r/ton alt tip karşılaştırmaları ağırlık uyumlu, yani compute1()/compute2() çiftleri de en özel bir yöntem vardır.

(String bağımsız değişken ile compute3() ve compute4() yöntem, Object bağımsız değişkeni yöntem daha spesifik Oysa böylece programı baskılar 6 ve 8)

benim akıl doğru mu?

cevap

0

Evet, gerekçeniz doğru.

+0

Kabul edildi, ancak ek bir aydınlanma görmek isterdim. –

0

sadece ilkel int ve bir kutulu Tamsayı alır başka bir yöntemi eklerseniz, doğru denilen yöntem hangisi çözebildiğinden: Buna dayanarak

int compute6(int i) { return 11;} 
int compute6(Integer i){return 12;} 
... 
System.out.println(y.compute6(1)); 

, ben hayal ediyorum Farklı parametreler arasındaki etkileşimle, sadece ayrı tip ilişkilerle ilgisi yoktur.

+2

Hayır, örneğinizde, compute6 (int), JLS'nin, farklı bir sorun olan otomatik boks/kutuklamayı kullanmaya çalışmadan önce yöntemlerin yerleştirilmesi gerektiğini belirttiği için ilk eşleşir. (Ve evet, bu kafa karıştırıcı. Sonunda, kenar vakalarını yönetmek için kolay bir sezgisel yol yok; sadece JLS tarafından kesin cevap olarak gitmelisin.) –

+0

Ah, ilginç. Bunu bilmiyordum. –