내가 다음 코드를 얻을 이름 충돌 오류 이해하려고 노력 중이 야의 방법 오버라이드 (override) 할 때 :이름 충돌 제네릭 클래스
import java.util.*;
import javax.swing.*;
class Foo<R extends Number> {
public void doSomething(Number n, Map<String, JComponent> comps) {
}
}
class Bar extends Foo {
public void doSomething(Number n, Map<String, JComponent> comps) {
}
}
오류 메시지 :
error: name clash:
doSomething(Number,Map<String,JComponent>)
inBar
anddoSomething(Number,Map<String,JComponent>)
inFoo
have the same erasure, yet neither overrides the other
내가 해결할 수 알을 그것은 Foo
에서 제네릭 형식을 제거하거나 Bar
선언을 class Bar extends Foo<Integer>
으로 변경하면됩니다. 내가 알고 싶은 것은이 오류가 특정 경우에 발생하는 이유이지만 각 방법에서 comps
매개 변수를 제거하면 사라집니다. 나는 type erasure에 대해 약간의 독서를 해왔지만 두 가지 방법 모두 제네릭의 유무와 상관없이 동일한 삭제가 있어야하며 따라서 두 경우 모두에서 유효한 무시가되어야합니다. (나는 어디에서나 generic 파라미터를 사용하지 않았다. 그래서 놀랍다.)
나는 부모 클래스에 제네릭 타입을 추가했음을 알고 있지만, 서브 클래스에 대한 경고 만 받았다. 오류가 아닙니다. 누구든지이 시나리오를 설명 할 수 있습니까?
: 당신이
@Override
에 확인 할 수있는 적절한 재정,추가 읽기입니다. –
@LuiggiMendoza 그렇습니다. 자바가 generic 매개 변수를 사용하지 않을 때 Java가 이러한 방식으로 다른 지우개를 사용한다고 생각하는 이유는 무엇입니까? 그리고 두 가지 모두에서 'comps' 인수를 제거하면 왜 행복합니까? 아마도 [브리지 메소드] (http://docs.oracle.com/javase/tutorial/java/generics/bridgeMethods.html)와 관련이 있지만 볼 수는 없습니다. –
'Map' 인터페이스는 제네릭을 사용합니다. 아마도 그것이 불평하는 이유 일 수 있습니다. 어떤 Java 버전을 사용하고 있습니까? 구체적으로 말하자면, 예를 들어 Java 6 u30 또는 Java 7 u40을 의미합니다. –