2016-10-24 11 views
11

मैं एक TreeTable साथ काम कर रहा हूँ और जब सेल कारखाने को बदलने मैं पारित करने के लिए आवश्यक कर रहा हूँ एकजावा जेनरिक "कैप्चर?"

Callback<TreeTableColumn<A, capture of ?>, TreeTableCell<A, capture of ?>> 

जहां एक एक वर्ग के साथ मैं काम कर रहा हूँ है, लेकिन मुझे नहीं पता कि कैसे की "कब्जा करने के साथ काम करने के लिए है? "

मैं

new Callback<TreeTableColumn<A, ?>, TreeTableCell<A, ?>> 

बनाने की कोशिश की लेकिन विचार के बजाय

setCellFactory(Callback<TreeTableColumn<A, capture<?>>, TreeTableCell<A, capture<?>>>) in TreeTableColumn cannot be applied to (anonymous Callback<TreeTableColumn<A, ?>, TreeTableCell<A, ?>>) 

चेतावनी मैं विशिष्ट वर्गों (स्ट्रिंग की तरह) उपयोग करने की कोशिश से पता चलता "?" साथ ही, लेकिन कुछ भी मदद नहीं की।

क्या कोई मुझे बता सकता है कि इस के साथ कैसे काम करना है?

धन्यवाद।

संपादित करें:

मैं थोड़ा और अधिक जानकारी एकत्र .. TreeTableColumn<S,T> की CellFactoryCallback<TreeTableColumn<S,T>, TreeTableCell<S,T>> होना चाहिए, हालांकि, TreeTableColumn (एक पुस्तकालय में) है कि मैं के साथ एक कच्चे प्रकार के रूप में बनाया जाता है काम कर रहा हूँ ।

कच्चे प्रकार के कॉलबैक कार्यों का उपयोग करना। लेकिन क्या कोई अन्य विकल्प है कि इसे कैसे काम करें?

+0

'' संकलक का मतलब पता नहीं है कि किस प्रकार है: अन्यथा, आप वाइल्डकार्ड कब्जा का उपयोग कर एक शुरू करने के लिए सक्षम हो सकता है। जब यह नहीं पता कि किस प्रकार का यह किसी अज्ञात समय से मेल नहीं खा सकता है। यह वाइल्डकार्ड की तरह नहीं है जो कुछ भी स्वीकार करता है। –

+1

'मैंने "?" के बजाय विशिष्ट वर्गों (जैसे स्ट्रिंग) का उपयोग करने की कोशिश की साथ ही, लेकिन कुछ भी मदद नहीं की। '- आप यह दिखाना चाहेंगे कि आपने वास्तव में क्या प्रयास किया था और आप यह भी शामिल करना चाहते हैं कि आपने उस अज्ञात उदाहरण को कैसे परिभाषित किया है, यानी कोड। – Thomas

+0

सटीक कोड है 'setCellFactory (नई कॉलबैक , TreeTableCell >() { @Override सार्वजनिक TreeTableCell कॉल (TreeTableColumn परम) { वापसी अशक्त; } });' या "?" के बजाय "स्ट्रिंग" – kotycheese

उत्तर

8

एक वाइल्डकार्ड एक अज्ञात प्रकार का प्रतिनिधित्व करता है।

वाइल्डकार्ड कैप्चर एक वाइल्डकार्ड प्रकार के मान को एक नए प्रकार चर के लिए बाध्य करने की प्रक्रिया है। उदाहरण के लिए:

List<?> list = ...; 
shuffle(list); 

जहां

<T> void shuffle(List<T> list) { 
    ... 
} 

यहाँ, ? की अज्ञात मान नए प्रकार चर T को shuffle विधि के आह्वान पर ही है, फेरबदल विधि उस प्रकार का उल्लेख करने की इजाजत दी।

जावा संकलक आंतरिक रूप से एक गुमनाम प्रकार चर, जो यह कहता है में यह कब्ज़ा करके वाइल्डकार्ड का मान "का कब्जा?" (वास्तव में, जावैक उन्हें "कैप्चर # 1" कहता है क्योंकि ? के विभिन्न उपयोग विभिन्न प्रकारों को संदर्भित कर सकते हैं, और इसलिए अलग-अलग कैप्चर होते हैं)।

ठीक है, तो आपके कोड में क्या गलत है? आप

Callback<TreeTableColumn<S,?>, TreeTableCell<S, ?>> factory; 

विधि हस्ताक्षर के साथ एक विधि

<S,T> setCellFactory(Callback<TreeTableColumn<S,T>, TreeTableCell<S,T>> factory); 

आह्वान करने के लिए कोशिश कर रहे हैं, प्रकार पैरामीटर टी, एक ही प्रकार के लिए खड़ा है कॉल करने वाले को प्रदान किया जाना चाहिए। एक सुविधा के रूप में, कंपाइलर स्वचालित रूप से उपयुक्त मान (-> प्रकार अनुमान) का अनुमान लगाने का प्रयास करता है। आपकी संकलन त्रुटि का अर्थ है कि संकलक ऐसा करने में असमर्थ था।

इस उदाहरण में, इस प्रकार निष्कर्ष नहीं की कमी है, क्योंकि यह वास्तव में असंभव है T करने के लिए एक उपयुक्त मान देना, क्योंकि दोनों ?T के उपप्रकार होने की जरूरत है, लेकिन संकलक नहीं जान सकता है कि दो ? एक ही प्रकार, या यहां तक ​​कि संबंधित प्रकार के लिए खड़े हो जाओ।

सफलतापूर्वक इस विधि को आमंत्रित करने के लिए, आपके तर्क प्रकार को टी के सभी घटनाओं के लिए एक ही प्रकार का उपयोग करना चाहिए। यदि आपके पास पहले से ही ऐसा प्रकार है, तो आगे बढ़ें और इसका उपयोग करें। ?

setCellFactory(newFactory()); 

जहां

<S,T> Callback<TreeTableColumn<S,T>, TreeTableCell<S,T>> newFactory() { 
    return new Callback<TreeTableColumn<S,T>, TreeTableCell<S,T>> { 
     ... 
    } 
} 
+0

आपको बहुत धन्यवाद, जेनेरिक तरीके वे समाधान हैं जिन्हें मैं ढूंढ रहा था! – kotycheese

2
मैं क्या what is a capture conversion और oracle capture generic docs यह लग रहा है कि आप कुछ समस्या का सामना कर रहे हैं, जहां संकलक की जरूरत सहायक वर्ग नहीं मिल सकता है, या वहाँ में वस्तु जगह करने की कोशिश करता है, लेकिन आप क्या उसे नहीं किया जा सकता देने से पाया से

सुरक्षित रूप से परिवर्तित

संपादित करें:

DEFAULT_CELL_FACTORY कोई cellFactory एक TreeTableColumn उदाहरण पर निर्दिष्ट किया जाता है

public static final Callback<TreeTableColumn<?,?>,TreeTableCell<?,?>>

, तो यह एक डिफ़ॉल्ट रूप से उपयोग किया जाएगा। वर्तमान में यह केवल ग्राफिक संपत्ति भीतर TableCell आइटम संपत्ति renders यदि आइटम एक नोड है, या यह बस toString() करता है, तो यह शून्य नहीं है कहता है, पाठ संपत्ति के अंदर जिसके परिणामस्वरूप स्ट्रिंग की स्थापना।

और

setCellFactory

public final void setCellFactory(Callback<TreeTableColumn<S,T>,TreeTableCell<S,T>> value)

संपत्ति cellFactory का मूल्य सेट करता है। संपत्ति विवरण: इस कॉलम में सभी कोशिकाओं के लिए सेल फैक्ट्री। सेल फ़ैक्टरी एक Tree TreeableColumn के लिए प्रत्येक TreeTableCell के भीतर मौजूद डेटा को प्रस्तुत करने के लिए ज़िम्मेदार है। डिफ़ॉल्ट रूप से TreeTableColumn एक डिफ़ॉल्ट सेल फैक्ट्री का उपयोग करता है, लेकिन इसे एक कस्टम कार्यान्वयन के साथ प्रतिस्थापित किया जा सकता है, उदाहरण के लिए डेटा को अलग तरीके से दिखाने या संपादन का समर्थन करने के लिए।कस्टम सेल फैक्ट्रियों को कहीं और बनाने पर बहुत सारे दस्तावेज हैं (उदाहरण के लिए सेल और ट्रीटेबल व्यू देखें)।

अंत में, वहाँ पहले से बने सेल कारखानों के एक नंबर javafx.scene.control.cell पैकेज में उपलब्ध हैं।

Java 8 API Doc से बाहर निकाला गया।

public static <S> Callback<TableColumn<S,String>, TableCell<S,String>> forTableColumn() { 
    return forTableColumn(new DefaultStringConverter()); 
} 

या कुछ और इस excactly क्या आप सेल में देना चाहता हूँ पर निर्भर करता है जैसे:

तो कुछ इस तरह सही दिशा में और अधिक जा रहा किया जाना चाहिए।

setCellFactory(TextFieldTableCell.<DataModel, Integer>forTableColumn(new IntegerStringConverter())); 

इन कोड के टुकड़े से This StackOverflow Thread

लिया जाता है और इस लिंक पिछले आप भी मदद कर सकता है: TableView Cell Tutorial

तो यह आप कुछ और प्रकाश अंधेरे में क्या कारण हो सकता है के बारे में देना चाहिए मुसीबत।

+0

क्या आपको कोई विचार है कि मैं क्या कर सकता था इसे काम करने के लिए? – kotycheese

+0

मैंने आपकी समस्या का प्रयास करने और आपकी समस्या से आपकी सहायता करने के लिए अपडेट किया। मैंने जावाएफएक्स या ट्रीटेबल व्यू का कभी भी उपयोग नहीं किया है, इसलिए मैं सिर्फ दस्तावेजों के शोध और पढ़ने से मदद कर सकता हूं :) उम्मीद है कि यह आपको @ कोटीचेज़ – Nico

+0

आपकी मदद करता है, आपने बहुत मदद की, आपने मुझे बहुत मदद की। मैंने अपना प्रश्न अपडेट किया और अधिक जानकारी जोड़ दी, क्या इससे समस्या का पता लगाने में मदद मिलती है? – kotycheese

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