Java 类型参数的防御 我不理解泛型类或方法中类型参数的强防御。它是一种引用类型,因此。。。什么?它只是不可偿还的类型吗?编译器的所有引用类型都是可恢复的还是不可恢复的 2.考虑众所周知的代码: List<? extends String> strs= new ArrayList<String>(); ? extends String str;//error strs.add("sd");//error List

Java 类型参数的防御 我不理解泛型类或方法中类型参数的强防御。它是一种引用类型,因此。。。什么?它只是不可偿还的类型吗?编译器的所有引用类型都是可恢复的还是不可恢复的 2.考虑众所周知的代码: List<? extends String> strs= new ArrayList<String>(); ? extends String str;//error strs.add("sd");//error List,java,generics,type-parameter,Java,Generics,Type Parameter,泛型是为读而不是写而设计的。这就是为什么可以在方法的参数中使用泛型,但不能将其用于声明可在读取/写入后使用的变量:-)泛型用于指定类型 考虑以下类别def: public interface List<E> extends Collection<E> 我们现在有了一个实现列表的MyList,但只接受Strings(或死者) 在这个类中,我们可以参考T public class MyList<T extends String> implements Lis

泛型是为读而不是写而设计的。这就是为什么可以在方法的参数中使用泛型,但不能将其用于声明可在读取/写入后使用的变量:-)

泛型用于指定类型

考虑以下类别def:

public interface List<E> extends Collection<E>  
我们现在有了一个实现列表的MyList,但只接受
String
s(或死者)

在这个类中,我们可以参考
T

public class MyList<T extends String> implements List<T> {
  private ArrayList<T> internalStorage;
现在Java知道了
T
MyList
中的含义,类T是一个MyStringType。
借助is知识,Java编译类并将对
T
的所有引用替换为对实际类
MyStringType
的引用
它完全忘记了T

现在,在课堂中,请注意提到的所有
T
都将被MyStringType取代。
但是如果我想处理一个字符串,但不一定是MyStringType,该怎么办呢

解决方案:
我这样定义一个成员:

List<? extends String> strs;  //Will fill the data in later

无法修复该变量,因为在创建保存该变量的类时无法确定其类型

你的问题弄糊涂了。它将受益于一个代码示例,在该示例中,您向我们展示了您想要实现的目标以及您试图使用的代码。@Johan当我们试图向
strs
添加某个字符串时,我们出现了编译错误。在编译器的错误描述符中,找不到签名为add(CAP#1,int)的方法。我不完全理解编译器是如何工作的。实际上,泛型适合于编译时而不是运行时。
MyList<MyStringType> test = new MyList<MyStringType>(parameters);  //java 6
MyList<MyStringType> test = new MyList<>(parameters);  //java 7, same but shorter.
List<? extends String> strs;  //Will fill the data in later
? extends String str;//error