2010-03-16 13 views
5

मुझे जावा जेनेरिक प्रकारों के चारों ओर अपने सिर को लपेटने में कठिनाई हो रही है। यहां कोड का एक साधारण टुकड़ा है जो मेरे दिमाग में काम करना चाहिए, लेकिन मैं स्पष्ट रूप से कुछ गलत कर रहा हूं।जेनेरिक प्रकारों का उपयोग कर जावा कन्स्ट्रक्टर

ग्रहण BreweryList.java में इस त्रुटि रिपोर्ट:

The method breweryMethod() is undefined for the type <T> 

विचार वस्तुओं है कि शराब की भठ्ठी वर्ग का एक उपवर्ग हैं के उदाहरण के साथ एक वेक्टर को भरने के लिए है, इसलिए मंगलाचरण होगा कुछ की तरह:

BreweryList breweryList = new BreweryList(BrewerySubClass.class, list); 

BreweryList.java

package com.beerme.test; 

import java.util.Vector; 

public class BreweryList<T extends Brewery> extends Vector<T> { 
    public BreweryList(Class<T> c, Object[] j) { 
     super(); 
     for (int i = 0; i < j.length; i++) { 
      T item = c.newInstance(); 

      // breweryMethod() is an instance method 
      // of Brewery, of which <T> is a subclass (right?) 

      c.breweryMethod(); 

      // "The method breweryMethod() is undefined 
      // for the type <T>" 
     } 
    } 
} 
,210

Brewery.java

package com.beerme.test; 

public class Brewery { 

    public Brewery() { 
     super(); 
    } 

    protected void breweryMethod() { 
    } 
} 

BrewerySubClass.java

package com.beerme.test; 

public class BrewerySubClass extends Brewery { 
    public BrewerySubClass() { 
     super(); 
    } 

    public void brewerySubClassMethod() { 
    } 
} 

मुझे यकीन है कि यह एक पूर्ण-जेनरिक-noob सवाल यह है हूँ, लेकिन मैं अटक कर रहा हूँ। किसी भी सुझाव के लिए धन्यवाद!

+2

'कक्षा' का दुरुपयोग करने के बजाय अपने स्वयं के 'ब्रूवरी फैक्ट्री' का उपयोग करने का दृढ़ संकल्प। यदि आप उचित रूप से प्रतिबिंब से बच सकते हैं, तो ऐसा करें। –

+4

http://stackoverflow.com/ प्रोग्रामिंग संबंधी प्रश्नों के लिए बहुत बेहतर है। –

+0

मैंने कुछ घंटे पहले यह प्रश्न देखा है। – Roman

उत्तर

9
item.breweryMethod(); 
बजाय

c.breweryMethod(); 

आप Class<T> पर विधि कॉल करने के उदाहरण पर नहीं प्रयास कर रहे थे

और वास्तव में, ग्रहण रिपोर्ट

विधि breweryMethod() प्रकार कक्षा < टी >

के लिए अपरिभाषित है और यह इस संदेश को क्या हो गया है से स्पष्ट किया जाना चाहिए।

(और आप के बाद तय है कि, आप भी अपवाद Class.newInstance() द्वारा घोषित संभाल करना होगा) टॉम Hawtin के रूप में एक टिप्पणी में सुझाव दिया

, तो आप बेहतर बजाय अपने विधि में प्रतिबिंब का उपयोग कर के एक factory method का उपयोग करेंगे, अपनी वस्तु बनाने के लिए।

+0

आच! आप सही हैं, बेशक: सी के बजाय आइटम। यह उपयुक्त "फेंकता" खंड जोड़ने के बाद अब संकलित करता है। मैं कारखाने के तरीकों की जांच करूंगा। पारितोषिक के लिए धन्यवाद। –

+0

@ बीयर मी ऑन एसओ यह आपके लिए एक उत्तर स्वीकार करने की सलाह है जो आपके लिए काम करता है (वोट काउंटर के नीचे टिक के माध्यम से) – Bozho

+0

समझ गया ... धन्यवाद। –

4

आप इसका मतलब यह नहीं है:

item.breweryMethod(); 

के बजाय:

c.breweryMethod(); 

?

+0

हां। धन्यवाद। स्पष्ट गलतियों को अक्सर देखना मुश्किल होता है। –

2

सबसे पहले, अपने सवाल का जवाब देने: पाश में यह होना चाहिए item.breweryMethod();c.breweryMethod(); के बजाय

मैं तुम क्या करने की योजना है क्या पता नहीं है, लेकिन यह सबसे अच्छा तरीका हो सकता है प्रतीत नहीं होता है। यहां कुछ सुझाव कैसे आप अपने कोड को बेहतर बना सकते हैं: एक सूची कार्यान्वयन का विस्तार करने के बजाय

  • सिंक्रनाइज़ किए जाने की

    • ArrayList के साथ बदलें Vector यदि आप सूची की जरूरत नहीं है, एक सूची का उपयोग कर पर विचार करें, या क्या आपकी ब्रूवरीलिस्ट मानक सूची की तुलना में अधिक कार्यक्षमता प्रदान करती है?
  • +0

    +1 विरासत पर संरचना की सिफारिश करने के लिए। – helpermethod

    +0

    उसी कारण के लिए एक और +1 – Alb

    +0

    ब्रूवरीलिस्ट अधिक कार्यक्षमता प्रदान करेगा, क्योंकि यह एक दूरस्थ MySQL डेटाबेस और स्मार्टफ़ोन डिस्प्ले के बीच एक इंटरफ़ेस है। मैं ArrayList पर एक नज़र डालेंगे; वास्तव में यह बेहतर काम कर सकता है। धन्यवाद। –

    1

    संभावित टाइपो के ऊपर उल्लिखित के अलावा ... मुझे आपके नमूना कोड में कहीं भी ऐसी कोई विधि initBreweryFromObject() परिभाषित नहीं है। यह तब त्रुटि है, नहीं?

    संबंधित मुद्दे