热门标签 | HotTags
当前位置:  开发笔记 > 编程语言 > 正文

Java中带有泛型的有界类型

Java中带有泛型的有界类型原文:https://www.ge

Java 中带有泛型的有界类型

原文:https://www.geeksforgeeks.org/bounded-types-generics-java/

有时,您可能希望限制可在参数化类型中用作类型参数的类型。例如,对数字进行操作的方法可能只想接受数字或其子类的实例。这就是有界类型参数的用途。


  • Sometimes we don't want the whole class to be parameterized. In this case, we can create a Java generic method. Because the constructor is a special method, we can also use generic types in the constructor.

  • Suppose we want to limit the object types that can be used in parameterized types. For example, in a method of comparing two objects, we want to ensure that the accepted objects are comparable.

  • These methods are called similarly to unbounded methods, except that if we try to use any incomparable classes, it will throw a compile-time error.

如何在 Java 中声明有界类型参数?


  1. Lists the names of type parameters,

  2. Unicom extends keyword

  3. And arranged according to its upper limit. (In the following example, c is a . )

语法

<T extends superClassName>

注意,在这个上下文中,extends 一般用于表示“extends”(如在类中)。此外,这指定 T 只能被超类名或超类名的子类替换。因此,超类定义了一个包含性的上限。

让我们举一个如何用泛型实现有界类型(扩展超类)的例子。

Java


// This class only accepts type parametes as any class
// which extends class A or class A itself.
// Passing any other type will cause compiler time error
class Bound<T extends A>
{
    private T objRef;
    public Bound(T obj){
        this.objRef = obj;
    }
    public void doRunTest(){
        this.objRef.displayClass();
    }
}
class A
{
    public void displayClass()
    {
        System.out.println("Inside super class A");
    }
}
class B extends A
{
    public void displayClass()
    {
        System.out.println("Inside sub class B");
    }
}
class C extends A
{
    public void displayClass()
    {
        System.out.println("Inside sub class C");
    }
}
public class BoundedClass
{
    public static void main(String a[])
    {
        // Creating object of sub class C and
        // passing it to Bound as a type parameter.
        Bound<C> bec = new Bound<C>(new C());
        bec.doRunTest();
        // Creating object of sub class B and
        // passing it to Bound as a type parameter.
        Bound<B> beb = new Bound<B>(new B());
        beb.doRunTest();
        // similarly passing super class A
        Bound<A> bea = new Bound<A>(new A());
        bea.doRunTest();
    }
}

输出

Inside sub class C
Inside sub class B
Inside super class A

现在,我们只限于类型 A 和它的子类,所以它会为任何其他类型的子类抛出一个错误。

爪哇


// This class only accepts type parametes as any class
// which extends class A or class A itself.
// Passing any other type will cause compiler time error
class Bound<T extends A>
{
    private T objRef;
    public Bound(T obj){
        this.objRef = obj;
    }
    public void doRunTest(){
        this.objRef.displayClass();
    }
}
class A
{
    public void displayClass()
    {
        System.out.println("Inside super class A");
    }
}
class B extends A
{
    public void displayClass()
    {
        System.out.println("Inside sub class B");
    }
}
class C extends A
{
    public void displayClass()
    {
        System.out.println("Inside sub class C");
    }
}
public class BoundedClass
{
    public static void main(String a[])
    {
        // Creating object of sub class C and
        // passing it to Bound as a type parameter.
        Bound<C> bec = new Bound<C>(new C());
        bec.doRunTest();
        // Creating object of sub class B and
        // passing it to Bound as a type parameter.
        Bound<B> beb = new Bound<B>(new B());
        beb.doRunTest();
        // similarly passing super class A
        Bound<A> bea = new Bound<A>(new A());
        bea.doRunTest();
        Bound<String> bes = new Bound<String>(new String());
        bea.doRunTest();
    }
}

输出:

error: type argument String is not within bounds of type-variable T


多重界限

有界类型参数可以与方法以及类和接口一起使用。

Java 泛型也支持多边界,也就是说,在这种情况下,A 可以是一个接口或类。如果 A 是类,那么 B 和 C 应该是接口。我们不能在多个范围内有一个以上的类。

语法:

<T extends superClassName & Interface>


Java


class Bound<T extends A & B>
{
    private T objRef;
    public Bound(T obj){
        this.objRef = obj;
    }
    public void doRunTest(){
        this.objRef.displayClass();
    }
}
interface B
{
    public void displayClass();
}
class A implements B
{
    public void displayClass()
    {
        System.out.println("Inside super class A");
    }
}
public class BoundedClass
{
    public static void main(String a[])
    {
        //Creating object of sub class A and
        //passing it to Bound as a type parameter.
        Bound<A> bea = new Bound<A>(new A());
        bea.doRunTest();
    }
}

输出

Inside super class A

本文由 Saket Kumar 供稿。如果你喜欢 GeeksforGeeks 并想投稿,你也可以使用contribute.geeksforgeeks.org写一篇文章或者把你的文章邮寄到 contribute@geeksforgeeks.org。看到你的文章出现在极客博客主页上,帮助其他极客。如果你发现任何不正确的地方,或者你想分享更多关于上面讨论的话题的信息,请写评论。


推荐阅读
  • Java学习笔记之面向对象编程(OOP)
    本文介绍了Java学习笔记中的面向对象编程(OOP)内容,包括OOP的三大特性(封装、继承、多态)和五大原则(单一职责原则、开放封闭原则、里式替换原则、依赖倒置原则)。通过学习OOP,可以提高代码复用性、拓展性和安全性。 ... [详细]
  • 本文介绍了如何在给定的有序字符序列中插入新字符,并保持序列的有序性。通过示例代码演示了插入过程,以及插入后的字符序列。 ... [详细]
  • 本文讨论了如何优化解决hdu 1003 java题目的动态规划方法,通过分析加法规则和最大和的性质,提出了一种优化的思路。具体方法是,当从1加到n为负时,即sum(1,n)sum(n,s),可以继续加法计算。同时,还考虑了两种特殊情况:都是负数的情况和有0的情况。最后,通过使用Scanner类来获取输入数据。 ... [详细]
  • 本文介绍了游标的使用方法,并以一个水果供应商数据库为例进行了说明。首先创建了一个名为fruits的表,包含了水果的id、供应商id、名称和价格等字段。然后使用游标查询了水果的名称和价格,并将结果输出。最后对游标进行了关闭操作。通过本文可以了解到游标在数据库操作中的应用。 ... [详细]
  • 本文介绍了在rhel5.5操作系统下搭建网关+LAMP+postfix+dhcp的步骤和配置方法。通过配置dhcp自动分配ip、实现外网访问公司网站、内网收发邮件、内网上网以及SNAT转换等功能。详细介绍了安装dhcp和配置相关文件的步骤,并提供了相关的命令和配置示例。 ... [详细]
  • 本文介绍了一个Java猜拳小游戏的代码,通过使用Scanner类获取用户输入的拳的数字,并随机生成计算机的拳,然后判断胜负。该游戏可以选择剪刀、石头、布三种拳,通过比较两者的拳来决定胜负。 ... [详细]
  • CSS3选择器的使用方法详解,提高Web开发效率和精准度
    本文详细介绍了CSS3新增的选择器方法,包括属性选择器的使用。通过CSS3选择器,可以提高Web开发的效率和精准度,使得查找元素更加方便和快捷。同时,本文还对属性选择器的各种用法进行了详细解释,并给出了相应的代码示例。通过学习本文,读者可以更好地掌握CSS3选择器的使用方法,提升自己的Web开发能力。 ... [详细]
  • 本文介绍了九度OnlineJudge中的1002题目“Grading”的解决方法。该题目要求设计一个公平的评分过程,将每个考题分配给3个独立的专家,如果他们的评分不一致,则需要请一位裁判做出最终决定。文章详细描述了评分规则,并给出了解决该问题的程序。 ... [详细]
  • 阿,里,云,物,联网,net,core,客户端,czgl,aliiotclient, ... [详细]
  • Spring特性实现接口多类的动态调用详解
    本文详细介绍了如何使用Spring特性实现接口多类的动态调用。通过对Spring IoC容器的基础类BeanFactory和ApplicationContext的介绍,以及getBeansOfType方法的应用,解决了在实际工作中遇到的接口及多个实现类的问题。同时,文章还提到了SPI使用的不便之处,并介绍了借助ApplicationContext实现需求的方法。阅读本文,你将了解到Spring特性的实现原理和实际应用方式。 ... [详细]
  • 本文讨论了一个关于cuowu类的问题,作者在使用cuowu类时遇到了错误提示和使用AdjustmentListener的问题。文章提供了16个解决方案,并给出了两个可能导致错误的原因。 ... [详细]
  • C# 7.0 新特性:基于Tuple的“多”返回值方法
    本文介绍了C# 7.0中基于Tuple的“多”返回值方法的使用。通过对C# 6.0及更早版本的做法进行回顾,提出了问题:如何使一个方法可返回多个返回值。然后详细介绍了C# 7.0中使用Tuple的写法,并给出了示例代码。最后,总结了该新特性的优点。 ... [详细]
  • 本文介绍了Java高并发程序设计中线程安全的概念与synchronized关键字的使用。通过一个计数器的例子,演示了多线程同时对变量进行累加操作时可能出现的问题。最终值会小于预期的原因是因为两个线程同时对变量进行写入时,其中一个线程的结果会覆盖另一个线程的结果。为了解决这个问题,可以使用synchronized关键字来保证线程安全。 ... [详细]
  • 本文详细介绍了Java中vector的使用方法和相关知识,包括vector类的功能、构造方法和使用注意事项。通过使用vector类,可以方便地实现动态数组的功能,并且可以随意插入不同类型的对象,进行查找、插入和删除操作。这篇文章对于需要频繁进行查找、插入和删除操作的情况下,使用vector类是一个很好的选择。 ... [详细]
  • ALTERTABLE通过更改、添加、除去列和约束,或者通过启用或禁用约束和触发器来更改表的定义。语法ALTERTABLEtable{[ALTERCOLUMNcolu ... [详细]
author-avatar
q40796672
这个家伙很懒,什么也没留下!
PHP1.CN | 中国最专业的PHP中文社区 | DevBox开发工具箱 | json解析格式化 |PHP资讯 | PHP教程 | 数据库技术 | 服务器技术 | 前端开发技术 | PHP框架 | 开发工具 | 在线工具
Copyright © 1998 - 2020 PHP1.CN. All Rights Reserved | 京公网安备 11010802041100号 | 京ICP备19059560号-4 | PHP1.CN 第一PHP社区 版权所有