найдены несовместимые типы: обязательно: перечисления по умолчанию в аннотациях - PullRequest
12 голосов
/ 15 сентября 2009
[javac] C:\ws\galileo\test\Cacheable.java:13: incompatible types
[javac] found   : com.io.CacheType
[javac] required: com.io.CacheType
[javac]  public CacheType id() default CacheType.COMMON;

Я действительно не понимаю этого. У меня есть проект, в котором я сам создаю кеширующий перехватчик для Spring. Это просто просмотр имени кэша для указания на EhCache и использование aop-autoproxy для загрузки CacheableAspect (который является моим кеширующим перехватчиком). Теперь, когда я использую значение по умолчанию в аннотации, ANT дает мне ошибку компилятора ниже. Я попытался обновить до последней версии JDK (сейчас я использую 1.6 16) и установить уровни источника / цели в скрипте ant, но безуспешно. Когда я удаляю значение по умолчанию и заставляю все области указывать значение, оно компилируется в ant fine.

В Eclipse это всегда работало, у меня были модульные тесты, которые отлично работали с предыдущим значением по умолчанию.

Что дает? Я попытался создать проект (без пружины), который просто отражал конфигурацию с помощью ant, и он компилировался в ant fine (и в eclipse).

, который говорит мне, МОЖЕТ, это может быть пружинное автоматическое проксирование как-то? но тогда почему компилятор не дал бы мне сгенерированное имя типа? Grrrr. Есть мысли?

import java.lang.annotation.ElementType;
import java.lang.annotation.Retention;
import java.lang.annotation.RetentionPolicy;
import java.lang.annotation.Target;

import com.io.CacheType;

@Retention(RetentionPolicy.RUNTIME) 
@Target({ElementType.METHOD}) 
public @interface Cacheable {
 public CacheType value() default Cachetype.COMMON;
}

public enum CacheType {

 COMMON("common"),
 PERSISTENT("persistent";

 private String cache;

 CacheType(String cache) {
  this.cache = cache;
 }

 public String cache() {
  return this.cache;
 }
}

Ответы [ 8 ]

18 голосов
/ 27 мая 2011

Все еще присутствует в JDK 6u25, но добавление пакета к значению по умолчанию делает свое дело:

CacheType value() default com.io.CacheType.COMMON;
1 голос
/ 28 марта 2012

Обнаружил, что эта ошибка решена в 1.6.0_31 и 1.7.0_03 (возможно, также в некоторых предыдущих версиях), поэтому просто обновите компилятор java.

1 голос
/ 28 сентября 2011

Все еще присутствует с использованием javac 1.6.0_26. Обходное решение yurez для использования полного имени типа при указании значения по умолчанию все еще работает.

1 голос
/ 18 апреля 2011

Итак, небольшое обновление. В то время как трекер ошибок показывает ошибку как закрытую и, кажется, хочет опровергнуть любые новые открытия ошибки. Когда я столкнулся с этой ошибкой в ​​этом примере, вращается вокруг процессора аннотаций времени компиляции. Поскольку сохранение - это RUNTIME, что означает, что для него не требуется процессор аннотаций времени компиляции, кажется, что процессор аннотаций времени компиляции взрывает процесс компиляции. Всякий раз, когда я нахожусь в NetBeans и у меня включены аннотации времени компиляции в разделе Build-> Compiling в свойствах проектов, я получаю туманный ряд ошибок.

Я собираюсь попытаться открыть новый тикет с ошибкой для этой проблемы и просто подумал, что сейчас покажу легкий обходной путь.

1 голос
/ 01 декабря 2009

Посмотрите здесь: http://bugs.sun.com/view_bug.do?bug_id=6512707 это может быть причиной вашей проблемы.

0 голосов
/ 03 декабря 2011

Работает с полным именем типа.

import java.lang.annotation.ElementType;
import java.lang.annotation.Retention;
import java.lang.annotation.RetentionPolicy;
import java.lang.annotation.Target;

import com.io.CacheType;

@Retention(RetentionPolicy.RUNTIME) 
@Target({ElementType.METHOD}) 
public @interface Cacheable {
 public CacheType value() default com.io.Cachetype.COMMON;
}
0 голосов
/ 15 сентября 2009

Не могли бы вы опубликовать весь исходный файл или что-то? Код, который вы разместили, кажется, скопирован / вставлен из разных исходных файлов и полон опечаток.

Обычно следующее всегда должно быть сделано, когда перечисление CacheType находится в другом исходном файле, в CacheType.COMMON произошла опечатка:

public @interface Cacheable {
 public CacheType value() default CacheType.COMMON;
}
0 голосов
/ 15 сентября 2009

Интересно, вызвано ли это определением Cacheable и CacheType в одном и том же исходном файле, а затем импортированием «com.io.CacheType». Возможно, это заставит компилятор думать, что есть два класса, называемых com.io.CacheType.

...