2013-03-29 3 views
0

다음을 상상해보십시오.개체가 항상 List의 멤버인지 확인하십시오.

모든 단어는 문자 목록입니다. 그러나 문자 자체가있을 수 없으며 항상 단어의 일부가되어야합니다.

그래서 말씀 클래스는 다음과 같이 수 :

이제
class Word extends List<MyCharacter> 

, 어떻게 Word의 일부가 아닌 MyCharacter를 인스턴스화 할 수 없습니다 것을 적용 할 수 있을까? 어쩌면 MyCharacterWord의 개인 내부 클래스로 만들고 addCharacter(String character)에서 Word과 같은 메서드를 추가 할 수 있습니까? 그렇다면 은 MyCharacter이 개인 내부 클래스 인 Word 인 반면 List 클래스를 확장 할 수 있습니까?

감사합니다.

업데이트 : 지금은 사용되는 방법을 여기

import java.util.ArrayList; 

public final class Word extends ArrayList<Word.MyCharacter> { 

    protected final class MyCharacter 
    { 
     private String character; 

     public String getCharacter() { 
      return character; 
     } 

     public MyCharacter(String character) 
     { 
      this.character=character; 
     } 
    } 

    public void addCharacter(String character) { 
     add(new MyCharacter(character)); 
    } 
} 

에 결국 그리고

:

public static void main(String[] args) { 

    Word word = new Word(); 

    // word.add(new MyCharacter("a")); // as intended: not possible, because MyCharacter class can't be accessed 
    word.addCharacter("a"); // ok   
} 
+1

시도해 보셨습니까? –

+1

'Character'로'java.lang.Character'를 의미합니까, 아니면 자신의 클래스 중 하나입니까? 기존 표준 클래스와 동일한 이름으로 클래스를 직접 만드는 것은 좋지 않습니다. – Jesper

+0

다른 오브젝트에는 오브젝트가 없습니다.참고 문헌 만 있습니다. 그리고'List <>'의 그릇이나'Word'의 방법이나 전적으로 다른 곳에서 온 모든 참조는 법 앞에 평등합니다. 귀하의 질의는 언어의 관점에서 이해조차되지 않으며 문자 그대로 구현하기가 어려울 것입니다. 아마 그것이 당신의 실제 목표를 반영하도록 그것을 바꾸십시오? – delnan

답변

1

이것은 이론 상으로는 가능합니다. Character이 이미 자바 클래스 인 경우 한 가지 문제가 발생합니다. 또한 이클립스를 사용하는 경우, 대부분의 문자를 보호하지 않는 한, 사용자가 선언 할 수 없도록

public class Word extends ArrayList<Letter> { 
    private class Letter { 
     //... 
    } 
} 

을 지정하지 않으면됩니다. 이클립스 문제인지 또는 자바가 당신을 막을 지 확신하지 못한다.

수퍼 클래스 문제는 List 만 인터페이스로 사용할 수 없기 때문에 발생합니다. ArrayList처럼 그것을 구현하는 것을 사용해야합니다.

+0

힌트를 가져 주셔서 감사합니다. 이제 작업 예제가 있습니다. 위의 내용을 참조하십시오. –

+0

"Character는 이미 Java 클래스입니다."라는 문제가 하나 발생합니다. - 이것은 어떤 식 으로든 문제가되지 않아야합니다. Java API에서 제공하는 클래스의 이름을 포함하여 동일한 이름의 여러 클래스를 갖는 것이 좋습니다. – JimmyB

1

어쩌면 문자 말씀의 개인 내부 클래스 만들기 및 추가 Word에서 addCharacter (String character)와 같은 메서드를 사용합니까?

예. 또는 MyCharacter의 생성자를 private으로 선언하고 MyCharacter 클래스를 final으로 선언하십시오. 아니면 'package-private'생성자를 갖는 Word 외부의 MyCharacter 클래스를 선언하십시오. 또는 안에 (정적) 팩토리 메소드를 가지고 appendToWord(Word w, Character char)과 같은 개인 생성자를 가질 수 있습니다. 아니면 ...

편집 :-) :

이 단어 민간 내부 문자 클래스와 List 클래스를 확장 할 수있을 것입니다 : 내가 먼저 질문을 오해?

Word은 어떤 식 으로든 List<T>까지 확장 할 수 있습니다. 그러나 - 너는 알아 낸 바대로 - List<Word.SomeInnerClass>이 아니다.

+0

한노, 귀하의 답변을 완전히 따를 수는 없지만 게시 된 예를 수정할 수 있습니까? 감사합니다 :-) –

+0

생성자를 private으로 선언하면 어떻게 그러한 클래스를 인스턴스화 할 수 있습니까? –

+0

'그냥 작동';) - 예를 들어 여기를 참조하십시오 : http://stackoverflow.com/questions/663059/why-do-inner-classes-make-private-methods-accessible – JimmyB

관련 문제