gpt4 book ai didi

Java 在一个类中混合泛型

转载 作者:行者123 更新时间:2023-11-29 03:53:14 28 4
gpt4 key购买 nike

  public class Foo<T> {  
private T value;
public Foo(T value){
this.value = value;
}

public Foo<T> Is(){
return this;
}

// At this point, I want a T that implements (extends) Comparable
// So i can compare the value.
// How to do it in Java.
public Foo<T extends Comparable> GreaterThanBar(T anotherValue)
{
return this;
}

}

这就像我想做的构建器模式,像流利的风格。链接方法。等

我有上面的类(class),我正在尝试从 C# 转换为 Java。在 C# 中,我可以添加 T: IComprable 有效的方法。

我如何使用 Java 执行此操作?我正在尝试在 GreaterThanBar 方法上执行此操作,以便我可以比较这些值。

public <T extends Comparable>  Foo<T> GreaterThan(T another)
{
if(another.compareTo(value) > 0){
throw new IllegalArgumentException();
}

return (Foo<T>) this;
}

这是正确的做法吗? Eclipse 让我转换它,但我想知道为什么我需要转换它?

这成功了。

有更好的方法吗?

作为一名 C# 开发人员,我真的很喜欢用 C# 轻松做到这一点。

最佳答案

您可能应该将您的类声明为:

public class Foo<T extends Comparable<T>>

在定义 GreaterThanBar 之前,您不会定义 T 必须是 Comparable,因此本质上您是在定义 T 的子类,因此提示需要进行转换。我认为。等到 GreaterThanBar 完全定义 T 必须是什么的语义是一个难以理解的挑战。在类里面进行。

更新:另一个答案指出方法配置文件中的 T 是不同的 T。这是有道理的,并解释了为什么需要强制转换,但如果某些自称语言律师可以确认情况确实如此,那就是有帮助。

更新二:提出问题:“如果我也想扩展Collection怎么办?”

好的,我知道这里发生了什么。你想要多重继承。抱歉,但这不会在 Java 中发生。在 Java 中,一个类只能有一个父类(super class)。 C++ 让你做到。你需要重新调整你的想法。 Java 让你做的是让一个类实现多个接口(interface)。你想这样做:

abstract class A implements Comparable<A>, Collection<A> {

}

class G<T extends A>{

}

当您创建 A 的具体子类时,您需要提供 Comparable 和 Collection 中所有抽象方法的实现。 A 的任何具体子类(或 A 子类的子类等)都可以在 G 中使用,保证 G 使用具有 Collection 属性的 Comparable 类。

关于Java 在一个类中混合泛型,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/7789283/

28 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com