- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
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/
我是一名优秀的程序员,十分优秀!