2013-07-25 7 views
1

코드 1

Utility.DetailsInfo myInfo=new Utility.DetailsInfo()의 경우 오류가 발생하는 이유는 무엇입니까?

No enclosing instance of type Utility is accessible. Must qualify the allocation with an enclosing instance of type Utility
(예 : x.new A() 여기서 x는 유틸리티의 인스턴스 임).내부 정적 클래스의 인스턴스를 만들 수 있습니까?

그래서 나는 내부 정적 클래스의 인스턴스를 만들 수 코드 2
을 사용할 수 있나요?
감사!

코드 1

public class Utility { 

    class DetailsInfo { 
     String title; 
     String path; 
     String size; 
     Bitmap thumbnails; 
    } 

    public static void GetPhotoDetailsByID(Context mycontext,String id,DetailsInfo myInfo){ 
      Cursor cur = mycontext.getContentResolver().query(
        MediaStore.Images.Media.EXTERNAL_CONTENT_URI, 
        null, 
        MediaStore.Images.Media._ID+"=?", 
        new String[]{id}, 
        ""); 
      if (cur.moveToFirst()){ 
       myInfo.title= cur.getString(cur.getColumnIndex(MediaStore.Images.Media.TITLE)); 
       myInfo.path = cur.getString(cur.getColumnIndex(MediaStore.Images.Media.DATA)); 
       myInfo.size=cur.getString(cur.getColumnIndex(MediaStore.Images.Media.SIZE)); 

       myInfo.thumbnails = MediaStore.Images.Thumbnails.getThumbnail(
            mycontext.getContentResolver(), 
            Integer.parseInt(id), 
            MediaStore.Images.Thumbnails.MICRO_KIND, 
            null); 

      } 
      cur.close(); 
     }  
} 

코드 2

public class Utility {  
    public static class DetailsInfo { 
     String title; 
     String path; 
     String size; 
     Bitmap thumbnails; 
    } 

    public static void GetPhotoDetailsByID(Context mycontext,String id,DetailsInfo myInfo){ 
      Cursor cur = mycontext.getContentResolver().query(
        MediaStore.Images.Media.EXTERNAL_CONTENT_URI, 
        null, 
        MediaStore.Images.Media._ID+"=?", 
        new String[]{id}, 
        ""); 
      if (cur.moveToFirst()){ 
       myInfo.title= cur.getString(cur.getColumnIndex(MediaStore.Images.Media.TITLE)); 
       myInfo.path = cur.getString(cur.getColumnIndex(MediaStore.Images.Media.DATA)); 
       myInfo.size=cur.getString(cur.getColumnIndex(MediaStore.Images.Media.SIZE)); 

       myInfo.thumbnails = MediaStore.Images.Thumbnails.getThumbnail(
            mycontext.getContentResolver(), 
            Integer.parseInt(id), 
            MediaStore.Images.Thumbnails.MICRO_KIND, 
            null); 

      } 
      cur.close(); 
     }  
} 

답변

1

check the docs에 대한 자세한 읽기와 정보를 월 당신이 부모 클래스의 객체 내부 클래스를 호출하기 때문에이 줄은 오류가 발생합니다

이 도움이 당신에게 ... ..

Utility.DetailsInfo myInfo=new Utility.DetailsInfo(); 

:

아이 클래스는

처럼 .. 그것을 정적이 아닌 경우에만 부모 클래스 객체 참조 할 수 있습니다 Utility.DetailsInfo 이후

Utility utility = new Utility(); Utility.DetailsInfo myInfo= new utility.DetailsInfo(); 

그리고 네 당신이 정적 선언 직접적으로내부 클래스의 인스턴스가 정적 할 수 있습니다 .. 코드 1에서

1

코드의 첫 번째 인스턴스의 문제는 내부 클래스가 고정되지 않는 것입니다. 이것은 새 인스턴스화를 위해 Utility.DetailsInfo의 인스턴스가 다음을 수행해야한다는 것을 의미 : 직접 인스턴스화하지 않고 Utility.DetailsInfo의 버전을 인스턴스화 할 수 있도록 두 번째 경우

Utility foo = new Utility(); 
Utility.DetailsInfo bar = foo.new DetailsInfo(); 

, Utility.DetailsInfo는, 정적 클래스는 Utility입니다. 중첩 된 클래스

0

, 당신은 itwithout 인스턴스화를 사용할 수 없습니다 정적 없습니다. 먼저 Utility의 객체를 인스턴스화 한 다음 내부 클래스 DetailsInfo에 액세스하려고합니다. DetailsInfo 이후 코드 2 그러나

Utility utility = new Utility(); 
Utility.DetailsInfo myInfo= utility.new DetailsInfo(); 

은, 당신이 직접 인스턴스화 할 수 정적 클래스로 정의된다.

Utility.DetailsInfo myInfo = new Utility.DetailsInfo(); 

외부 클래스에만 유용 할 경우에만 다른 클래스에 클래스를 포함시키는 것이 이상적입니다. 이러한 경우에 "도우미 클래스"를 중첩하면 패키지가보다 간소화되고 그렇지 않으면 피하는 것이 좋습니다.

관련 문제