2012-09-26 11 views
5

Eclipse 3.4. Java derleyici düzeyi 1.6 JRE IBM 1.6Javac'ta muğlak Constructor referansı, ancak Eclipse'de değil

Formun değiştirilemediği bir kitaplık sınıfımız var.

import java.util.Hashtable; 
public class A extends Hashtable { 
    ... 
} 

Ve biz başka bir sınıftan kurucular birini aramaya çalıştığınızda sorun oluşur A.

public class B { 
    private A a; 
    public B() { 
    this.a = new A(); 
    } 
    public B(final A props) { 
    this.a = props; 
    } 
    public B(final Map<String, String> props) { 
    this(); 
    for (String key : props.keySet()) { 
     add(key, props.get(key)); 
    } 
    } 
    @SuppressWarnings("unchecked") 
    public B add(final String name, final Object value) { 
    a.put(name, value); 
    return this; 
    } 
} 

kolay erişim sağlamak için bir yardımcı sınıf inşa var.

public class C { 

    public void stuff() { 
    A a = new A(); 
    B b = new B(a);//Error in javac 
    } 
} 

Eclipse hatasız bu listeler ve bu karınca javactır yoluyla derlenmiş ve jenkins zaman derleyici aşağıdaki gibi bir hata verir.

reference to B is ambiguous, both method B(com.foo.A) in com.bar.B and method B(java.util.Map<java.lang.String,java.lang.String>) in com.bar.B match 
    [javac]   B b = new B(a); 

Bu hata javac'ta meydana gelir mi? Benim görüşüme göre daha spesifik bir yöntemi seçmek için tutulma doğrudur. HashTable Harita uygulayan yana

+1

java'da olduğu gibi Eclipse ile aynı JDK'yı kullandığınızdan emin misiniz? – dbalakirev

+3

A, 'HashTable'ı genişletiyor. Bu 'Hashtable' olmalı? –

+0

@David düzeltildi -> Düzenlendi –

cevap

0

, belirsizlik vardır. HThis cevabı bazı goot bilgiler içerir: class Hashtable genişletir ve siz A sınıfı Harita özelliklerini alır ve aynı zamanda Harita olur diyebiliriz böylece Hashtable'a kendisi, Harita arabirimini uygulayan

Calling ambiguously overloaded constructor in Java

+0

Ancak Hashtable, Haritadan daha belirgindir, bu yüzden, bu durumun seçilmeden seçilmesi gerekir. JLS -> http://docs.oracle.com/javase/specs/jls/se5.0/html/expressions.html#308804 Bu, Harita –

-1

gibi. Eğer public B(final A props) ve public B(final Map<String, String> props) yaşıyorsanız zaman her iki kurucu içinde bir harita argümanyaşıyorsanız gibi

öyle.

Bu yüzden size belirsizlik veriyor.

+0

-1'de bildirilen jeneriklerle ilgili bir sorun olmalı açıklamanın doğru olduğunu düşünüyorsun. Birbirlerinin alt türleri olan parametrelerle aşırı yüklü metotlara sahip olmak mükemmel bir şekilde geçerlidir. Eclipse'de de belirttiğim gibi bu sorunu sorunsuz bir şekilde derleyebiliriz. Derleyici, çalışma zamanında parametrenin bildirilen türüne göre daha spesifik bir yöntem seçer. Hashtable, Harita'dan daha spesifik olduğu için, belirsizlik olmadan seçilmelidir. JLS -> dokümanlar.oracle.com/javase/specs/jls/se5.0/html/… Bu, Harita üzerinde bildirilen jeneriklerle ilgili bir sorun olmalı. –

0

sorun diğer bir parametreli Harita kabul ederken bir yapıcısı, bir ham Hashtable kabul olmasıdır. Her iki kurucu da uygulanabilir, ancak bu durumda, bu mantık yürütme mantığı, Java Language Specification'a göre işe yaramaz - bir kurucu, diğer argümanın argümanının (katı) bir alt türü olması durumunda diğerinden daha spesifik olacaktır. Bu aşamada kontrol edilmeyen alt yazılara izin verilmez, bu nedenle belirsizlik.