当前位置: 首页 > 知识库问答 >
问题:

Java泛型:运算符“*”不能应用于T,T。我很难理解泛型

严成礼
2023-03-14

我在学院有一些工作,我们必须按照给定的模块实现通用代码。

所以我正在创建一个只接受整数LongDoubleString的类

我看了一些关于泛型的youtube视频,也很理解,但我的代码中有一个问题,我在任何地方都找不到解决方案。

这是我的课:

    public Kubus(T tinggi, T panjang,T lebar ) {

        this.tinggi = tinggi;
        this.panjang = panjang;
        this.lebar = lebar;

    }

    public T getTinggi() {
        return tinggi;
    }

    public T getPanjang() {
        return panjang;
    }

    public T getLebar() {
        return lebar;
    }

    @Override
    public String toString() {
        return "tinggi: " + getTinggi() +
                "  - panjang: " + getPanjang() +
                " - lebar: " + getLebar();
    }

    public T getResultAsLong(){
        T = getPanjang() * getLebar();
    }
}

在getResultAslong方法中,它应该采用长数据类型,但我有一个问题,即不能使用*操作数。问题是什么?

共有3个答案

潘高岑
2023-03-14

如果您的T类型需要是一个数字,那么您可以使用定义

您有几个选择:

>

  • 不要使用泛型。使用长值方法定义一个接口或抽象类,然后将其扩展为您想要支持的各种类型。

    通过带有Long.value(getLabar(). toString())String转换为long。这本质上是在转换为long之前将所有内容转换为字符串。不优雅。

    使用数字的实例和字符串的实例来决定如何将它们转换为长的。

  • 曾飞雨
    2023-03-14

    如果要执行乘法操作(*),则首先需要将getPanjang()和getLebar()的值转换为任何数字格式,然后执行乘法操作。

    郤坚诚
    2023-03-14

    我要指出的第一件事是,不能直接定义一个只接受特定类型列表的类。您只能将T绑定为1类型(或类型交集)的子类。

    对于问题中列出的类型,它们唯一常见的超类型是SerializableObject。您可以将类型变量声明为:

    class Kubus<T extends Serializable> { // or Kubus<T>, equivalent to T extends Object
    

    但是您可以使用此绑定中的任何T进行实例化,例如Kubus

    如果您希望它只接受这些类型,那么您所能做的就是限制类的构造方式,方法是将构造函数设为私有,然后为您想要的类型提供静态工厂方法:

    private Kubus(T tinggi, T panjang,T lebar ) { ... }
    
    public static Kubus<Integer> ofInteger(Integer tinggi, Integer panjang, Integer lebar ) {
      return new Kubus<>(tinggi, panjang, lebar);
    }
    
    public static Kubus<Long> ofLong(Long tinggi, Long panjang, Long lebar ) {
      return new Kubus<>(tinggi, panjang, lebar);
    }
    
    // etc for other specific types.
    

    然后,您可以使用

    Kubus<Integer> first = Kubus.ofInteger(1, 2, 3);
    Kubus<Long> second = Kubus.ofLong(1L, 2L, 3L);
    

    写入类型Kubus仍然有效

    Kubus<ArrayList<Frobnicator>> whatever = null;
    

    这实际上为您提供了解决所问具体问题(*)的机会。

    问题是你不能把任意的事物相乘。在这里,您需要一些方法将“东西”转换为长的,以便将其相乘。强制转换为长码不是一个安全的选择,因为您不能将整数或字符串强制转换为长码。

    因为您想将T限制为仅某些类型,所以您还可以提供一个转换器来安全地进行转换类型。

    这种转换器可以使用ToLongFunction建模

    private Kubus(T tinggi, T panjang,T lebar, ToLongFunction<T> converter ) { ... }
    
    public static Kubus<Integer> ofInteger(Integer tinggi, Integer panjang, Integer lebar ) {
      return new Kubus<>(tinggi, panjang, lebar, i -> i.intValue());
    }
    
    public static Kubus<Long> ofLong(Long tinggi, Long panjang, Long lebar ) {
      return new Kubus<>(tinggi, panjang, lebar, lng -> lng.longValue());
    }
    
    // etc for other specific types.
    

    将converter分配给构造函数中的一个字段,然后在乘法方法中应用以获得long值,该值可以乘以:

    return converter.applyAsLong(getTinggi())
        * converter.applyAsLong(getPanjang())
        * converter.applyAsLong(getLebar());
    

    (*)我无意暗示您只能将此方法与私有构造函数一起使用:当然,您可以使构造函数非私有,并直接使用构造函数实例化。我只是怀疑你很快就会厌倦写作中的重复:

    Kubus<Integer> first = new Kubus<>(1, 2, 3, Integer::longValue);
    Kubus<Integer> second = new Kubus<>(1, 2, 3, Integer::longValue);
    Kubus<Integer> third = new Kubus<>(1, 2, 3, Integer::longValue);
    // ...
    

     类似资料:
    • 本文向大家介绍Java泛型 T与T的使用方法详解,包括了Java泛型 T与T的使用方法详解的使用技巧和注意事项,需要的朋友参考一下 泛型(Generic type 或者 generics)是对 Java 语言的类型系统的一种扩展,以支持创建可以按类型进行参数化的类。可以把类型参数看作是使用参数化类型时指定的类型的一个占位符,就像方法的形式参数是运行时传递的值的占位符一样。 在集合框架(Collec

    • 问题内容: 我想知道以下两个方法声明之间有什么区别: 有什么可以/可以做的,而不是另一种?我在本网站的其他地方找不到这个问题。 问题答案: 与上下文隔离-没有区别。在和两者上,您只能调用的方法。 但是有上下文-如果您有泛型类: 然后: 与对象相同的代码 两个优点: 无需强制转换(编译器向您隐藏了此内容) 编译有效的时间安全性。如果使用的是版本,则不能确保方法始终返回。如果返回,则在运行时会有一个。

    • 问题内容: 运行Demo类将在SomeClass中调用静态方法newInstance来调用构造函数并打印问候 定义方法将包括返回类型+方法名称以及参数 newInstance的返回类型是 SomeClass 在我看来很奇怪,因为我的班级叫做SomeClass 而不是 SomeClass 为什么在SomeClass 前面需要 ?看来,如果我不包含它,将会出现一个常见错误,称为“无法对非静态类型T进行

    • 问题内容: 我想知道Java中是否有特殊原因总是使用“ ”而不是“ ”来定义类型参数的界限。 例: 被禁止但是 是正确的。是什么原因呢? 问题答案: 在类“实现”还是“扩展”之间,通用约束语言没有语义差异。约束可能性是“扩展”和“超级”-也就是说,该类是可分配给其他类的对象(扩展),还是该类可从该类分配(超级)。

    • 问题内容: 我的问题是有关Java 7中的泛型的。假设我们有这样的类层次结构: 就像在Java泛型教程中一样 我们还有一堂课 这是使用该类的代码: 问题1: 我在这里已经阅读了有关这些问题的信息,但仅仅是这样。但我告诉编译器这样类型的将是任何动物类型的亚型。那么为什么它仍然给出编译时错误? 问题2: 如果我指定而不是一切正常,那么编译器不会说不好。为什么在这种情况下它可以正常工作而在上面的示例中却

    • 目前,我使用这个解决方案,使用,而不是: