java - 非泛型类中的泛型实例变量

标签 java generics

我正在尝试编写一个具有泛型成员变量但本身不是泛型的类。具体来说,我想说我有一个“实现与自身可比较的某种类型”的值列表,这样我就可以对该列表调用排序......我希望这是有道理的。

我想要做的事情的最终结果是创建一个类,这样我就可以创建一个具有数组(任何给定类型)的所述类的实例,并让它为该列表生成一个字符串表示。在实际代码中,我还传入了我要传入的类型的类:

String s = new MyClass(Integer.class, 1,2,3).asString();
assertEquals("1 or 2 or 3", s);
String s = new MyClass(String.class, "c", "b", "a").asString();
assertEquals("\"a\" or \"b\" or \"c\"", s);

本来我什至不想传入类,我只是想传入值并让代码检查结果数组以挑选出值的类......但这也给我带来了麻烦.

以下是我的代码,但我想不出适合变量类型的正确方法。

public class MyClass {
    // This doesn't work as T isn't defined
    final List<T extends Comparable<? super T>> values;

    public <T extends Comparable<? super T>> MyClass (T... values) {
        this.values = new ArrayList<T>();
        for(T item : values) {
            this.values.add(item);
        }
    }

    public <T extends Comparable<? super T>> List<T> getSortedLst() {
        Collections.sort(this.values);
        return this.values;
    }
}

变量声明行错误:

Syntax error on token "extends", , expected

非常感谢任何帮助。

编辑:更新代码以使用列表而不是数组,因为我不确定它是否可以用数组完成。

@Mark:从我读过的所有内容来看,我真的很想说“T 是一个与自身可比的类型”,而不仅仅是“T 是一个可比的类型”。也就是说,以下代码也不起作用:

public class MyClass {
    // This doesn't work
    final List<? extends Comparable> values;

    public <T extends Comparable> MyClass (T... values) {
        this.values = new ArrayList<T>();
        for(T item : values) {
            this.values.add(item);
        }
    }

    public <T extends Comparable> List<T> getSortedLst() {
        Collections.sort(this.values);
        return this.values;
    }
}

添加行错误:

The method add(capture#2-of ? extends Comparable) in the type List<capture#2-of ? extends Comparable> is not applicable for the arguments (T)

排序行错误:

Type mismatch: cannot convert from List<capture#4-of ? extends Comparable> to List<T>

结论:

归根结底,Java 似乎不能完全处理我想做的事情。问题是因为我想说的是:

I want a list of items that are comparable against themselves, and I create the whole list at once from the data passed in at creation.

但是,Java 看到我有那个列表,但无法确定我的情况的所有信息在编译时都可用,因为我可以稍后尝试将内容添加到列表中,并且由于类型删除,它不能保证那个安全。如果不将泛型类型应用于类,就不可能真正向 Java 传达我的情况所涉及的条件。

最佳答案

我认为简单的答案是你不能那样做。如果类属性之一的类型取决于类型参数,则必须在类级别声明该参数。而且我不认为它以任何其他方式“有意义”。

如果您示例中的 T 不是类的类型参数,那它是什么?它不能是方法的类型参数,因为该类型由方法的调用方式决定。 (如果在不同的静态上下文中调用该方法,并为 T 推断出不同的类型,那么在属性声明的上下文中,T 的名义类型是什么?)

因此,为了让这回到您在这里尝试做的事情,MyClass 的实例将保存某种类型的元素,并且您希望能够在静态类型安全的环境中插入和删除元素时尚。但与此同时,您不希望能够说出该类型是什么。那么编译器应该如何静态地区分保存(比如)Integer 对象的MyClass 实例和保存String< 的实例 对象?

我什至认为您无法通过显式动态类型检查来实现这一点。 (我认为类型删除意味着 getSortedList() 方法的实现无法找出绑定(bind)到其返回类型的实际类型。)

没有。真正的解决方案是使 MyClass 成为声明类型参数 T 的泛型类;例如

public class MyClass <T extends Comparable<T>> {

并从两个方法中移除方法级类型参数T的声明。

关于java - 非泛型类中的泛型实例变量,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/3191613/

相关文章:

java - 双轴快速排序和快速排序有什么区别?

java - 如何比较变量作为字符串?

java - 什么时候使用 Image.flush() 是安全的(或强制的)?

Windows 操作系统上的 java File.listFiles() 在逻辑上不是连续的

java - 如何通过 I2c 读取更多字节

c# - 如何使用类型参数从泛型类型中提取原始泛型类型

java - 如何限制那个子类不能泛型?

多种类型时的 Scala 方差

java - 如何通过反射初始化类并指定类的泛型类型

c# - 您认为泛型属性在 .NET 中有用吗?