相关疑难解决方法(0)

什么是原始类型,为什么我们不应该使用它?

问题:

  • 什么是Java中的原始类型,为什么我经常听说不应该在新代码中使用它们?
  • 如果我们不能使用原始类型,它有什么替代方案,它是如何更好的?

java generics raw-types

617
推荐指数
13
解决办法
20万
查看次数

泛型类中的Java泛型方法

如果在Java中创建泛型类(该类具有泛型类型参数),您可以使用泛型方法(该方法采用泛型类型参数)吗?

请考虑以下示例:

public class MyClass {
  public <K> K doSomething(K k){
    return k;
  }
}

public class MyGenericClass<T> {
  public <K> K doSomething(K k){
    return k;
  }

  public <K> List<K> makeSingletonList(K k){
    return Collections.singletonList(k);
  }
}
Run Code Online (Sandbox Code Playgroud)

正如您所期望的泛型方法,我可以调用任何对象的doSomething(K)实例MyClass:

MyClass clazz = new MyClass();
String string = clazz.doSomething("String");
Integer integer = clazz.doSomething(1);
Run Code Online (Sandbox Code Playgroud)

但是,如果我尝试使用MyGenericClass 没有指定泛型类型的实例,我调用doSomething(K)返回一个Object,无论K传入什么:

MyGenericClass untyped = new MyGenericClass();
// this doesn't compile - "Incompatible types. Required: String, Found: Object" …
Run Code Online (Sandbox Code Playgroud)

java generics language-design raw-types generic-method

29
推荐指数
1
解决办法
7770
查看次数

为什么在Java 7中使用菱形运算符进行类型推断?

List<String> list = new ArrayList(); 将导致编译器警告.

但是,以下示例编译时没有任何警告: List<String> list = new ArrayList<>();

我很好奇为什么需要引入钻石操作员.为什么不只是对构造类型推断,如果类型参数是不存在(因为它已经在Java静态方法做,像谷歌番石榴集合库开发)

编辑:使用millimoose答案作为起点我查看了实际上是什么类型的擦除,它不只是删除所有类型信息.编译器实际上做了一些(从官方文档复制):

  • 如果类型参数是无界的,则用泛型或对象替换泛型类型中的所有类型参数.因此,生成的字节码仅包含普通的类,接口和方法.
  • 如有必要,插入类型铸件以保持类型安全.
  • 生成桥接方法以保留扩展泛型类型中的多态性.

java type-inference diamond-operator java-7

12
推荐指数
3
解决办法
9235
查看次数

为什么未定义的变量泛型参数会丢弃它的方法返回类型的显式泛型参数?

public abstract class A<T> {
    public static void test(A i) { for (String s : i.get()) {} }
    public abstract Iterable<String> get();
}
Run Code Online (Sandbox Code Playgroud)

为什么上面的代码我得到:

incompatible types
required: String
found:    Object
Run Code Online (Sandbox Code Playgroud)

但是如果我将test方法的参数改为A<Object>,它会编译好吗?为什么未定义的变量泛型参数会丢弃它的方法返回类型的显式泛型参数?

java generics

2
推荐指数
1
解决办法
196
查看次数