??xml version="1.0" encoding="utf-8" standalone="yes"?>夜夜爽夜夜爽精品视频,91亚洲精品一区二区,jizz在线观看视频http://www.aygfsteel.com/jiangshachina/category/30635.html同是Java爱好者,盔R何必曾相识Q?lt;br>    a cup of Java, cheers!zh-cnSat, 03 Aug 2013 17:43:24 GMTSat, 03 Aug 2013 17:43:24 GMT60在泛型中使用通配W和l承(?http://www.aygfsteel.com/jiangshachina/archive/2009/12/28/307495.htmlSha JiangSha JiangMon, 28 Dec 2009 05:44:00 GMThttp://www.aygfsteel.com/jiangshachina/archive/2009/12/28/307495.htmlhttp://www.aygfsteel.com/jiangshachina/comments/307495.htmlhttp://www.aygfsteel.com/jiangshachina/archive/2009/12/28/307495.html#Feedback0http://www.aygfsteel.com/jiangshachina/comments/commentRss/307495.htmlhttp://www.aygfsteel.com/jiangshachina/services/trackbacks/307495.html在泛型中使用通配W和l承
    本文是Sun官方以Blog形式发布的Java核心技术窍?JavaCoreTechTip)中的一?/a>Q它以非常简z的CZ展示了泛型通配W的使用Q初学Java泛型的朋友可以看看?2009.12.30最后更?
    Java2q_Q标准版5.0(J2SE 5.0)为JavaE序设计语言及其q_引入了泛型。在最单的案例和典型的应用中,泛型能够识别集合容器中所存储的是否是你所期望的对象。所以,你可以特别说你有一个String或其它类型对象的ListQ而不是声UC的程序有一个Object的List。所以,如果你不心向该List中加入了错误cd的对象,~译器会告之你这个错误。该错误在~译时进行修复,而不用等Cq行该程序,且在E序q行到该处代码时Q在获取对象的操作中产生一个运行时的强制类型{换异常?br /> q就提出了泛型的W二个好处。P代器变得类型安全了。Iterator接口中的next()Ҏ会q回集合中下一个元素的cd安全版本?br />     但这q不是本文要介绍的泛型应用的H门Q那些窍门已?a >2005 Core Java Technologies Tip
描述q了。在使用泛型Ӟ大多Ch都不能很好地理解对extends关键字的使用。一个典型的描述如何使用extends关键字的CZ与绘制图形有兟뀂与其不同的是,此处H门所用的CZ用SwinglgQ以便你不必创徏额外的新cR在一个非常有限的例子中,Swing按钮lg的类层次l构如下所C,当然QObject是实际上的根?br />
Component
|- Container
   
|- JComponent
      
|- AbstractButton
         
|- JButton
         
|- JMenuItem
            
|- JCheckBoxMenuItem
            
|- JMenu
            
|- JRadioButtonMenuItem
         
|- JToggleButton
            
|- JCheckBox
            
|- JRadioButton

    所有AbstractButton的子c都共同享有的一个东西就是方法getText。这是泛型的精髓,你能定义一个方法去处理以AbstractButton为元素的ListQƈq回q些按钮的Stringcd的标{List。下面是该方法的W一个版本:
public static List<String> getLabels(List<AbstractButton> list) {
    List
<String> labelList = new ArrayList<String>(list.size());
    
for (AbstractButton button: list) {
        labelList.add(button.getText());
    }
    
return labelList;
}

    下面是如何使用该方法。首先,定义一个AbstractButtoncd的ListQ然后向其中填充|q调用该ҎQ?br />
List<AbstractButton> buttonList = new ArrayList<AbstractButton>();
buttonList.add(
new JButton("Hello"));
buttonList.add(
new JCheckBox("World"));
buttonList.add(
new JRadioButton("Hola"));
buttonList.add(
new JMenuItem("Mundo"));

List labels 
= getLabels(buttonList);
System.out.println(labels);

    ҎGoogleQ?Hola, Mundo"?Hello, World"的西班牙译文。调用println()Ҏ的结果如下所C:
[Hello, World, Hola, Mundo]

    对于AbstractButton?span style="font-family: Courier;">List
对象Q一切都能正常运行,但当是其它类型,特别是AbstractButton子类型的ListӞ׃能正常工作了。从逻辑上,有h可能认ؓ对于以JButton为元素的ListQ一切仍能正常工作。因为JButton是AbstractButton的子cR难道不能对AbstractButton子类型的List调用ҎgetLabels(List<AbstractButton>)Q?br /> 然而,事实q如此。因是一个编译时查,同时也因为getLabelsҎ被定义ؓ只接受AbstractButton的ListQ你不能向该Ҏ中传入Q何其它类型的List?br />
GetList.java:13: getLabels(java.util.List<javax.swing.AbstractButton>)
  in GetList cannot be applied to (java.util.List
<javax.swing.JButton>)

    List
<String> labels = getLabels(buttonList);
                          
^
1 error

q也是extends关键字发挥作用的地方了。不?span style="font-family: Courier;">getLabes
Ҏ定义Z仅接?span style="font-family: Courier;">AbstractButton ListQ而是它定义为接?span style="font-family: Courier;">AbstractButton子类?span style="font-family: Courier;">ListQ?br />
public static List<String> getLabels(
        List
<? extends AbstractButton> list)

此处的通配W?表明该方法ƈ不关心确切的cd是什么,只要它是AbstractButton的子cd卛_。下面是l合了前q所有代码片断的完整CZE序Q?br />
import java.util.*;
import javax.swing.*;

public class GetList {
    
public static void main(String args[]) {
        List
<JButton> buttonList =
                
new ArrayList<JButton>();
        buttonList.add(
new JButton("Hello"));
        buttonList.add(
new JButton("World"));
        buttonList.add(
new JButton("Hola"));
        buttonList.add(
new JButton("Mundo"));

        List labels 
= getLabels(buttonList);
        System.out.println(labels);
    }

    
public static List<String> getLabels(
            List
<? extends AbstractButton> list) {
        List
<String> labelList = new ArrayList<String>(list.size());
        
for (AbstractButton button: list) {
            labelList.add(button.getText());
        }
        
return labelList;
    }
}

现在Q当你要用泛型来定义你自qcdҎӞp考虑接受作ؓ泛型参数的抽象类Q或它的M类Q记得用通配W以便相同的Ҏ对于子类也能很好地工作?br /> 更多关于泛型的信息,误两篇较早前由Gilad Bracha撰写的教E:一是2004q的教程(PDF)Q另一是在线?a >Java Tutorial中的泛型章节?br />


Sha Jiang 2009-12-28 13:44 发表评论
]]>
使用Callableq回l果(?http://www.aygfsteel.com/jiangshachina/archive/2008/05/31/204007.htmlSha JiangSha JiangSat, 31 May 2008 14:24:00 GMThttp://www.aygfsteel.com/jiangshachina/archive/2008/05/31/204007.htmlhttp://www.aygfsteel.com/jiangshachina/comments/204007.htmlhttp://www.aygfsteel.com/jiangshachina/archive/2008/05/31/204007.html#Feedback0http://www.aygfsteel.com/jiangshachina/comments/commentRss/204007.htmlhttp://www.aygfsteel.com/jiangshachina/services/trackbacks/204007.html使用Callableq回l果
    本文是Sun官方以Blog形式发布的Java核心技术窍?JavaCoreTechTip)中的一个。本文主要介l了Callable及其相关接口和类的用,幅不长且易于理解,故翻译在了此处,怿对于准备或刚接触java.util.concurrent的朋友会有所帮助?2008.05.31最后更?

    自从Javaq_的最开始,Runnable接口已存在了。它允许你定义一个可qE完成的d。如大多Ch所已知的那P它只提供了一个runҎQ该Ҏ既不接受M参数Q也不返回Q何倹{如果你需要从一个未完成的Q务中q回一个|你就必须在该接口之外使用一个方法去{待该Q务完成时通报的某U消息。例如,下面的示例就是你在这U情景下可能做的事情Q?br />     Runnable runnable = ...;
    Thread t = new Thread(runnable);
    t.start();
    t.join();
    String value = someMethodtoGetSavedValue()
严格来说Q上qC码ƈ无错误,但现在可用不同的ҎdQ这要感谢J2SE 5.0引入的Callable接口。不同于Runnable接口拥有runҎQCallable接口提供的是callҎQ该Ҏ可以q回一个Object对象Q或可返回Q何一个在泛型化格式中定义了的特定cd的对象?br />     public interface Callable<V> {
       V call() throws Exception;
    }
因ؓ你不可能把Callable对象传到Thread对象L行,你可换用ExecutorService对象L行Callable对象。该服务接受Callable对象Qƈl由submitҎL行它?br />     <T> Future<T> submit(Callable<T> task)
如该Ҏ的定义所C,提交一个Callable对象lExecutorService会返回一个Future对象。然后,Future的getҎ会dQ直CQ务完成?br />     Z证明q一点,下面的例子ؓ命o行中的每个词都创Z个单独的Callable实例Q然后把q些词的长度加v来。各个Callable对象只是计它自己的词的长度之和。Futures对象的Set集合被保存以便从中获得计算用的倹{如果需要保持返回值的序Q则可换用一个List对象?/span>
import java.util.*;
import java.util.concurrent.*;

public class CallableExample {

    
public static class WordLengthCallable
            
implements Callable {
        
private String word;
        
public WordLengthCallable(String word) {
            
this.word = word;
        }
        
public Integer call() {
            
return Integer.valueOf(word.length());
        }
    }

    
public static void main(String args[]) throws Exception {
        ExecutorService pool 
= Executors.newFixedThreadPool(3);
        Set
<Future<Integer>> set = new HashSet<Future&lg;Integer>>();
        
for (String word: args) {
            Callable
<Integer> callable = new WordLengthCallable(word);
            Future
<Integer> future = pool.submit(callable);
            set.add(future);
        }
        
int sum = 0;
        
for (Future<Integer> future : set) {
            sum 
+= future.get();
        }
        System.out.printf(
"The sum of lengths is %s%n", sum);
        System.exit(sum);
    }
}
WordLengthCallable保存了每个词q用该词的长度作ؓcallҎ的返回倹{这个值可能会q儿时间去生成Q不q在q个例子中,可以立即知道它?callҎ的唯一要求是这个D在callҎ的结֤q回。当Future的getҎE后被调用时Q如果Q务运行得很快的话QFuture会自动得到q个?如同本例的情?Q否则将一直等到该值生成完毕ؓ止。多ơ调用getҎ不会Dd从该U程q回。因E序的目的是计划所有字的长度之和,它不会强令Callabledl束。如果最后一个Q务在前三个Q务之前完成,也是没错的。对Future的getҎ的第一ơ调用将只会{待Set中第一个Q务结束,而不会阻塞其它的d分别执行完毕。它只会{待当次U程或Q务结束。这个特定的例子使用固定数线E池来生ExecutorService对象Q但其它有效的方法也是可行的?br />     关于执行器和U程池用法的更多信息Q请见Java Tutorial?a >Executors一节。SwingWorkercL另一个用Future的Runnable对象的例子,管有些微不同之处。更多信息请见Java Tutorial?a >Worker Threads and SwingWorker一节?br />


Sha Jiang 2008-05-31 22:24 发表评论
]]>
字符串排??http://www.aygfsteel.com/jiangshachina/archive/2008/04/07/190912.htmlSha JiangSha JiangMon, 07 Apr 2008 01:10:00 GMThttp://www.aygfsteel.com/jiangshachina/archive/2008/04/07/190912.htmlhttp://www.aygfsteel.com/jiangshachina/comments/190912.htmlhttp://www.aygfsteel.com/jiangshachina/archive/2008/04/07/190912.html#Feedback3http://www.aygfsteel.com/jiangshachina/comments/commentRss/190912.htmlhttp://www.aygfsteel.com/jiangshachina/services/trackbacks/190912.html字符串排?/span>
    本文是Sun官方以Blog形式发布的Java核心技术窍?JavaCoreTechTip)中的一个。我之前未xqjava.text.Collatorc,看过Sorting Stringsq个tip之后觉得有些意义Q故译在了此处Q也希望对其它朋友有所助益?2008.04.07最后更?

    使用Javaq_q行字符串排序被认ؓ是一件简单的工作Q但为国际市场开发程序时Q则需要有更多的考虑。如果你陷入只关注英语的心态中Qƈ认ؓ你的E序会工作的很好Q因为它所昄的字W串从今往后都是一LQ你可能认ؓ一切都很正常。但一旦你有一位西班牙用户Q他希望能够正常地对mañanaq行排序Q但如果你都是用StringcM~省的compareҎd排序Q字W?#241;会跟在字符z之后Q而在正常的西班牙语排序中Q?#241;应该在字Wn和o之间。这是java.text包的cCollator发挥作用的地方了?
惛_q样的一l词
  • first
  • mañana
  • man
  • many
  • maxi
  • next
使用Stringcȝ默认排序机制Q即它的compare()ҎQ排序的l果会是:
  • first
  • man
  • many
  • maxi
  • mañana
  • next
    此处Qmañana出现在maxi与next之间。而在西班牙语世界中,mañana应该出现在many和maxi之间Q? 因ؓ在字母表中,字符ñ(Meñe)跟在n之后。当来了一个d语用P想用他们自己的变音符Ӟ你就可以写一个自q定制排序规则来处?#241;Q? 否则一l用façade的设计模式将会怎样呢?你是否想让façade出现在factory之前或之后呢Q?关键是如同对c或其它字W那样去处理ç的小写变音符?
    q就是类Collator能派上用场的地方了。类Collator用于对语a敏感的排序问题,q不会只Z它们的ASCII/Unicode字符d试排序? 使用Collator要求你在完全应用它的Ҏ之前要理解一个额外的属性,即称之ؓ强度(Strength)的属性。Collator的强度设|决定了在排序时如何使用?或弱)匚w? 该属性有4个可能的|PRIMARYQSECONDARYQTERTIARY和IDENTICAL。具体是哪个强度在生作用取决于语言环境? 典型圎ͼ会有如下的情c按从后往前的序QIDENTICAL强度表示能够被进行相同的处理的字W必L一致的。TERTIARY通常用于忽略大小写差异。SECONDARY用于忽略变音W,如n?#241;? PRIMARY与IDENTICAL怼也是Z字母之间差异Q但是当处理控制字符和发xq是有所不同。查?code>Collator的javadocQ? 以获取更多关于这些强度之间的差异及分?Decomposition)模式规则的信息?
    Z使用CollatorQ你需要先得到它的一个实例。你既可以调用getInstanceҎ以得C个针寚w认语a环境的Collator对象Q? 也可以传递一个指定的Locale对象lgetInstanceҎ以得C个针对特定语a环境的Collator对象。例如,Z获得针对一个西班牙语的 Collator对象Q你应用new Locale("es")dZ个西班牙语的Locale对象Q然后将它传入getInstanceҎ中:
Collator esCollator =
    Collator.getInstance(
new Locale("es"));
    假设针对该语a环境的默认Collator强度Q针对西班牙语的默认强度是SECONDARY已经_了。然后你这个Collator对象如Q一Comparator对象 那样传入CollectionscȝsortҎ的比较规则参CQ以得到排序后的List对象?br />
Collections.sort(list, esCollator);
操作之前的单词列表,你现在就会得C个基于西班牙语字母表的恰当排序结果:
  • first
  • man
  • many
  • mañana
  • maxi
  • next
如果你在上述Collator中换用US的Locale对象Q由?#241;q不是US中本有的字母Q所以mañana会出现在man和many之间?
q儿有一个简z的例子以显C些差异? import java.awt.*;
import java.text.*;
import java.util.*;
import java.util.List; // Explicit import required
import javax.swing.*;
public class Sort {
    
public static void main(String args[]) {
        Runnable runner 
= new Runnable() {
            
public void run() {
                String words[] 
= {"first""mañana""man",
                    
"many""maxi""next"};
                List list 
= Arrays.asList(words);
                JFrame frame 
= new JFrame("Sorting");
                frame.setDefaultCloseOperation (JFrame.EXIT_ON_CLOSE);
                Box box 
= Box.createVerticalBox();
                frame.setContentPane(box);
                JLabel label 
= new JLabel("Word List:");
                box.add(label);
                JTextArea textArea 
= new JTextArea( list.toString());
                box.add(textArea);
                Collections.sort(list);
                label 
= new JLabel("Sorted Word List:");
                box.add(label);
                textArea 
= new JTextArea(list.toString ());
                box.add(textArea);
                Collator esCollator 
= Collator.getInstance(new Locale("es"));
                Collections.sort(list, esCollator);
                label 
= new JLabel("Collated Word List:");
                box.add(label);
                textArea 
= new JTextArea(list.toString());
                box.add(textArea);
                frame.setSize(
400200);
                frame.setVisible(
true);
            }
        };
        EventQueue.invokeLater (runner);
    }
}

    最后还有一点儿关于语言排序规则的信息。通过调用getInstanceҎ而得到的Collator对象通常是支持特定语a的RuleBasedCollator实例? 你可使用RuleBasedCollatord义你自己的排序顺序。该cȝJavadoc更完整地描述了这U规则的语法Q但q是让我们先假设你有一?字符字母表, q希望字母的序是CAFEQ而不是ACEFQ你的规则看h像q样Q?/span>
String rule =
    
"< c, C < a, A < f, F < e, E";
RuleBasedCollator collator 
= new RuleBasedCollator(rule);
    上述规则通过展示不同字母的大写定义了特定的字母序为cafe。现在对单词列表aceQcafeQef和face使用新的规则q行排序Q? 排序l果的顺序ؓcafeQaceQface和efQ?string>
import java.text.*;
import java.util.*;

public class Rule {
    
public static void main(String args[]) throws ParseException {
        String words[] 
= {"ace""cafe""ef""face"};
        String rule 
="< c, C < a, A < f, F < e, E";
        RuleBasedCollator collator 
= new RuleBasedCollator(rule);
        List list 
= Arrays.asList(words);
        Collections.sort(list, collator);
        System.out.println(list);
    }
}
在对上述代码~译q运行之后,你将看到使用新规则排序后的单词:
> javac Rule.java
> java Rule
[cafe, ace, face, ef]
    请以后阅读Javadoc中更多的关于 规则语法的信息,再尝试扩展字母表q处理不同的变音W?br />     现在Q当你ؓ全世界开? E序Ӟ你的E序p做出更好的准备以去适应本地用户了。也要确保字W串在资源包中,如之前的一个窍门所展示的那PEarlier tip?译注Q原文ƈ没有提供q个Earlier tip的正链接地址?

Sha Jiang 2008-04-07 09:10 发表评论
]]>
վ֩ģ壺 | | | ʶ| | | | | | | | | | ͭ| Դ| | | | | | «ɽ| | ɾ| ׯ| | | | | | ˳| | ӯ| Ϫ| | | Դ| | ϴ| ˶| ɽ| |