在类中声明类型参数时,Java泛型类型会丢失常量类型

野崎晃平

我正在使用Oracle JDK 7u79。我不知道为什么下面的代码会产生编译错误:

package generics;

import java.util.Collection;
import java.util.Collections;

class SomeClass {
    public Collection<String> getStringCollection() {
        return Collections.singleton("hello");
    }
}

class SomeTypedClass<T> {
    public Collection<String> getStringCollection() {
        return Collections.singleton("hello");
    }
}

public class SomeTest {
    public static void main(String[] args) {
        final int length1 = new SomeClass()     .getStringCollection().iterator().next().length();
        final int length2 = new SomeTypedClass().getStringCollection().iterator().next().length(); // compilation error
    }
}

错误:

Error:(21, 89) java: cannot find symbol
  symbol:   method length()
  location: class java.lang.Object

我指定常量泛型类型Collection<String>作为方法的参数getStringCollection(),所以我认为无论是SomeClassSomeTypedClass应该没有错误编译。

为什么会这样?Collection不强制转换的情况下不断输入正确的解决方案是什么?

肯·斯莱德

实际上,由于您SomeTypedClass<T>希望T传入一个类型,即使它没有使用该类型,您也需要在以下代码中执行此操作SomeTest

public class SomeTest {
    public static void main(String[] args) {
        final int length1 = new SomeClass()     .getStringCollection().iterator().next().length();
        final int length2 = new SomeTypedClass<String>().getStringCollection().iterator().next().length(); // no more compilation error
    }
}

我使用了String,但是您可以使用Object,因为T实际上并没有使用。

可能值得考虑对您的SomeTypedClass班级做更多这样的事情,具体取决于您的实际情况:

class SomeTypedClass<T> {
    public Collection<T> getTypedCollection(T object) {
        return Collections.singleton(object);
    }
}

然后,您可以执行以下操作:

final int length2 = new SomeTypedClass<String>().getTypedCollection("hello").iterator().next().length();

如果您仅对衍生自的类感兴趣String,还可以执行以下操作:

class SomeTypedClass<T extends String> {
    public Collection<T> getStringCollection(T object) {
        return Collections.singleton(object);
    }
}

然后,您可以执行以下操作:

final int length2 = new SomeTypedClass<String>().getStringCollection("hello").iterator().next().length();

本文收集自互联网,转载请注明来源。

如有侵权,请联系[email protected] 删除。

编辑于
0

我来说两句

0条评论
登录后参与评论

相关文章

来自分类Dev

类声明中的泛型类型

来自分类Dev

Java泛型:方法声明参数中的类型扩展

来自分类Dev

Java泛型,类型丢失

来自分类Dev

泛型java函数使用的“类型参数”的“类类型”

来自分类Dev

将类型参数作为类型参数的类传递给Java中的泛型方法

来自分类Dev

将类型参数作为类型参数的类传递给Java中的泛型方法

来自分类Dev

java类中的多个泛型类型

来自分类Dev

Java泛型:定义泛型类时的通配符和类型参数语法

来自分类Dev

在泛型类型的泛型类上访问类型参数

来自分类Dev

推断时泛型类型丢失

来自分类Dev

如何使用泛型类型声明类 - Java 1.7

来自分类Dev

PHP:输入参数的类型声明中的类常量

来自分类Dev

当参数化类型通过层次结构传递时,在Java中创建泛型类型的实例吗?

来自分类Dev

如果未指定类型参数,为什么Java泛型原始类会擦除对象的所有泛型?

来自分类Dev

Java泛型-参数化的类与类型化方法

来自分类Dev

Java泛型方法采用类类型的参数

来自分类Dev

在泛型类隐式类型参数

来自分类常见问题

从泛型类中的类型参数创建新对象

来自分类Dev

泛型类中的隐式类型参数

来自分类Dev

Swift泛型:类型声明中的位置

来自分类Dev

使用泛型类型时“使用未声明的类型名称”

来自分类Dev

强制泛型类型参数为类类型?

来自分类Dev

从泛型类型类确定方法参数类型

来自分类Dev

Scala:引用类的嵌套类型,它是泛型的类型参数

来自分类Dev

泛型类型,其类型参数是抽象基类

来自分类Dev

类中的getConstructors()中的泛型类型

来自分类Dev

全局声明泛型类型

来自分类Dev

约束泛型参数是不同的类型Java中

来自分类Dev

Java泛型类型参数混淆

Related 相关文章

热门标签

归档