2009-10-23 3 views
3

EDIT: Это оказалось не проблемой с кодом на всех, но с ошибкой в ​​плагине Groovy Eclipse, (http://jira.codehaus.org/browse/GRECLIPSE-373)Java неоднозначный тип для метода?

Eclipse дает мне странное сообщение об ошибке о неоднозначных типов в программе Java и я действительно не понимаю, почему. У меня есть интерфейс, который принимает общий параметр, указывающий, какой тип данных он возвращает.

public interface InterfaceA<T> { 
    T getData(); 
} 

Одна из реализаций это выглядит следующим образом:

public class Impl<T extends AnotherClass> implements InterfaceA<Collection<T>> { 
    public Collection<T> getData() { 
     // get the data 
    } 
} 

Существует также контейнер для InterfaceA

public class Container<T extends InterfaceA> 
{ 
    private T a; 

    public Container(T a) { 
     this.a = a; 
    } 

    public T getA() { 
     return a; 
    } 
} 

Doing это вызывает "GetData неоднозначна" ошибка.

Container<Impl<AnotherClass>> c = new Container(new Impl<AnotherClass>()); 
Collection<AnotherClass> coll = c.getA().getData(); 

Я в тупике на этом.

+0

Не видя этой проблемы в Eclipse 3.4.2 с помощью JDK 1.6.0_10 – Nate

+0

Возможно, вам нужно предоставить нам подробную информацию о 'AnotherClass'. Я просто попробовал 'java.util.Date' (это не окончательный вариант) вместо' AnotherClass', и он компилируется в Eclipse. Просто второстепенный, вам не хватает 'interface' в' InterfaceA', а 'getData' должен быть общедоступным в' Impl' –

+0

Я использую Eclipse 3.5 с JDK 1.6.0_16, но я понял, что не опубликовал код. Я обновил код с реальной проблемой. –

ответ

5

Там, кажется, ошибка вызывает это из заводного плагина. http://jira.codehaus.org/browse/GRECLIPSE-373. Это не проблема Java. Спасибо за помощь и мои извинения.

+0

Можете ли вы изменить вопрос, чтобы включить это? – mkb

+0

Я обновил вопрос с этой информацией наверху. –

+1

Никаких извинений не нужно, я уверен, ваш вопрос будет полезен кому-то другому (например, мне);) – jambriz

0

Ваш отредактированный пример отлично подходит для меня (JDK 1.5), за исключением того, что вы должны определить общий тип конструктора. Вот мой полный рабочий код:

public interface InterfaceA<T> { 
    T getData(); 
} 

public static class Impl<T extends Date> implements InterfaceA<Collection<T>> { 
    public Collection<T> getData() { 
     return null; 
    } 
} 

public static class Container<T extends InterfaceA> { 
    private T a; 

    public Container(T a) { 
     this.a = a; 
    } 

    public T getA() { 
     return a; 
    } 

} 

public static void main(String[] args) { 
    Container<Impl<Date>> c = new Container<Impl<Date>>(new Impl<Date>()); 
    Collection<Date> coll = c.getA().getData(); 
} 
2

Collection<T> getData() определено в Impl должно быть сделано общественности. Если я это сделаю, код будет компилироваться для меня.

+0

Да, извините, это была ошибка копирования/вставки. Я понял, что код, который я разместил, не был ошибочным, но я обновил код, который является проблематичным. –

0

То, что у вас здесь, кажется законным. Возможно, Eclipse показывает ошибку, иначе это не должно.

Перейти к Windows> Предпочтения> Java> Компилятор> Ошибки/Предупреждения. В разделе «Общие типы» убедитесь, что Eclipse не сообщает об ошибке для любой из перечисленных операций (если вы этого не хотите). У меня все мое в этом разделе установлено «Предупреждение». Затем я попытаюсь обновить проект и перезапустить Eclipse.

Редактировать: После того, как обновленное сообщение было сделано, я получил предупреждение (а не все еще об ошибке) на линиях использования, говоря: «Контейнер является сырым типом. Ссылки на общий тип Контейнер должен быть параметризован:». Это может быть исправлено:

Container<Impl<Date>> c = new Container<Impl<Date>>(new Impl<Date>()); 

(В моем примере я использую java.util.Date, как вместо «AnotherClass»).

+0

опечатка. я отредактировал вопрос –

+0

Это не компилируется для меня чисто ... не может @Override реализация метода интерфейса - вместо этого он должен быть суперклассом. – Nate

+2

@Nate: вы используете 1.5. Куга - 1,6. – alphazero

0

[Редактировать, чтобы отразить обновленный вопрос]

Это не должно даже компилировать, как вы уменьшаете видимость метода от общественности упаковки объема:

public class Impl<T extends AnotherClass> implements InterfaceA<Collection<T>> { 
    Collection<T> getData() { 
     // get the data 
    } 
} 

И это все еще компилирует для меня (Eclispe 3.4, OS X, 1.5), поэтому не знаю, в чем проблема:

пакет temp.tests;

import java.util.Collection; 

public interface InterfaceA <T> { 

    T getData(); 

    public static final class AnotherClass {} 

    public static final class Impl<T extends AnotherClass> 
      implements InterfaceA<Collection<T>> 
    { 
     public Collection<T> getData() { 
      return null; 
     } 
    } 

    public static class Container<T extends InterfaceA> 
    { 
     private T a; 
     public Container(T a) { this.a = a; } 
     public T getA() { return a; } 
    } 

    public static final class Test { 
     public static void main (String[] args) { 
      Container<Impl<AnotherClass>> c = new Container(new Impl<AnotherClass>()); 
      Collection<AnotherClass> coll = c.getA().getData(); 
     } 
    } 
} 
+0

Спасибо, что посмотрели на это. Я отправил ответ, касающийся плагина groovy/eclipse. Оказывается, это был преступник. –

+0

NP! Вы можете добавить это как обновление своего вопроса. – alphazero

0

Как и другие плакаты, я не вижу этой проблемы в Eclipse 3.5.0, работающей на JDK 1.6.0.14 (при фиксации уменьшенной видимости метода getData()).

Предлагаю сделать чистую сборку (проект/очистить в затмении). Кроме того, вы можете использовать запущенную Eclipse и версию Java.

- Flaviu Cipcigan

+0

Я обновил код, чтобы правильно проиллюстрировать проблему. Он все еще ломается в затмении, но, похоже, работает, если я компилирую только с javac. –