我知道关于这个话题有很多问题,但遗憾的是他们无法帮助我消除我的晦涩.首先,看下面的例子.我不明白,为什么以下"添加"-method someCage.add(rat1)不起作用并以下列异常中止:
线程"main"中的异常java.lang.Error:未解决的编译问题:Cage类型中的方法add(捕获#2-of?extends Animal)不适用于参数(Rat)
这Cage<Rat>是不一样的原因Cage<Animal>吗?如果是,我在这个例子中不理解它,所以我不确定编译器到底做了什么.这是代码示例:
package exe;
import cage.Cage;
import animals.Animal;
import animals.Ape;
import animals.Lion;
import animals.Rat;
public class Main {
public static void main(String[] args) {
Lion lion1 = new Lion(true, 4, "Lion King", 8);
Lion lion2 = new Lion(true, 4, "King of Animals", 9);
Ape ape1 = new Ape(true, 2, "Gimpanse", true);
Ape ape2 = new Ape(true, 2, "Orang Utan", true);
Rat rat1 = new Rat(true, 4, "RatBoy", true);
Rat rat2 = new …Run Code Online (Sandbox Code Playgroud) 我设置了Maven的Android测试项目,并按照此处的说明进行操作.基本上我能够设置测试项目,甚至模拟器被识别,但我仍然无法在执行mvn install时在Maven中运行测试(在Eclipse中).如果我尝试执行它,我会收到以下错误:
测试失败:警告(junit.framework.TestSuite $ 1):构造函数中的异常:testPersistAndRead(java.lang.RuntimeException:Stub!(..)warning(junit.framework.TestSuite $ 1):构造函数中的异常:testFileNotExists(java.lang .RuntimeException:Stub!(..)warning(junit.framework.TestSuite $ 1):构造函数中的异常:testCreateFiles(java.lang.RuntimeException:Stub!(..)warning(junit.framework.TestSuite $ 1):构造函数中的异常:testFilesExist(java.lang.RuntimeException:Stub!(..)warning(junit.framework.TestSuite $ 1):构造函数中的异常:testAndroidTestCaseSetupProperly(java.lang.RuntimeException:Stub!(..)
surfire的输出告诉我它嵌套在AndroidTestCase中:
junit.framework.AssertionFailedError:构造函数中的异常:testPersistAndRead(java.lang.RuntimeException:Stub!at android.test.AndroidTestCase.(AndroidTestCase.java:5)[...]
这是我尝试运行的测试.
public class PersistenceManagerTest extends AndroidTestCase {
private final String FILENAME_PREFIX = "test.";
protected void setUp() throws Exception {
super.setUp();
deleteInternalStorageFile();
MockContentResolver resolver = new MockContentResolver();
RenamingDelegatingContext renamingDelegatingContext = new RenamingDelegatingContext(new MockContext(), getContext(), FILENAME_PREFIX);
Context context = new IsolatedContext(resolver, renamingDelegatingContext);
setContext(context);
}
//AfterClass
protected void tearDown() {
deleteInternalStorageFile();
}
public void testPersistAndRead() throws IOException {
String testData = "foobar";
PersistenceManager.persist(testData, FileType.JSONDATA); …Run Code Online (Sandbox Code Playgroud) 我知道浮动点变量在投射时会失去精度.但是我不明白的是,为什么从较小的原语到较大的原语的演员是不确定的,反之亦然.我会理解,如果它发生在从double到float,但它是另一种方式.为什么会这样?
查看这两个测试的结果:
@Test
public void castTwoPrimitiveDecimalsUnpreciseToPrecise()
{
float var1 = 6.2f;
double var2 = var1;
assertThat(var2, is(6.2d)); //false, because it's 6.199999809265137
}
@Test
public void castTwoPrimitiviesDecimalsPreciseToUnpresice()
{
double var1 = 7.6d;
float var2 = (float)var1;
assertThat(var2, is(7.6f)); //true
}
Run Code Online (Sandbox Code Playgroud) 关于原语:当我从较小的类型转换为较大的类型时,转换是隐式的,当我从较大的类型转换为较小的类型时,我需要显式地转换原语,由于数据丢失,这很明显。但有一点我不明白。在某些情况下(字节和短),当我向上或向下转换为 char 时,我总是需要在两个方向上显式转换,尽管字节(8 位)适合字符(16 位)?
(另见http://docs.oracle.com/javase/tutorial/java/nutsandbolts/datatypes.html)
看我的例子...
public class CastingTest
{
public static void main(String[] args)
{
//casting from smaller to bigger types
short c = 13;
int d = c;
byte f = 34;
short g = f;
byte h = 20;
long i = h;
byte var03 = 6;
double var04 = var03;
//casting from bigger to smaller types
int j = 12;
short k = (short)j;
long m = 56;
int n = (int)m;
double …Run Code Online (Sandbox Code Playgroud) 当我以这种方式向 settings.xml 添加设置时...
<profiles>
<profile>
<id>outsorced-project-properties</id>
<properties>
<key.password>mysecretpassword</key.password>
</properties>
</profile>
</profiles>
<activeProfiles>
<activeProfile>outsorced-project-properties</activeProfile>
</activeProfiles>
Run Code Online (Sandbox Code Playgroud)
..然后我可以将 ${key.password} 与我的项目的 pom.xml 一起使用。这有效,但似乎有点不方便。
在MavenPropertiesGuide 中,您可以通过设置使用 settings.xml 中的设置。字首。
本地用户设置
类似地,可以使用带有设置的属性名称来引用用户 settings.xml 中的值。字首。
Run Code Online (Sandbox Code Playgroud)${settings.localRepository} refers to the path of the user's local repository
但这似乎对我不起作用。至少我不知道如何在 settings.xml 中定义它们。我试图在 settings.xml 的 settings 标签内或 settings 标签内的 properties 标签内定义它们,等等,但这些属性从未被识别。我理解错了吗?
我在由片段创建的窗口中显示 AdMob 广告横幅。这有效,但我遇到了奇怪的泄漏问题,我还不明白。当我多次打开和关闭应用程序时,广告片段每次都会被正确销毁,但控制该片段的 MainActivity 正在泄漏:

有罪的是代码中的这一行:
adRequest = new AdRequest.Builder().addTestDevice(DEVICE_ID_MOTO_G).addTestDevice(DEVICE_ID_ZTE).build();
mAdView.loadAd(adRequest);
Run Code Online (Sandbox Code Playgroud)
(您可以在下面看到我已经尝试使 adRequest 无效,但没有结果。)无论如何,当我注释这两行时,不会发生泄漏。我测试了两次,因为很难相信这个调用会泄漏,但它确实发生了。这是片段代码。正如你所看到的,我什至取消了onDestroy(). 我可以保证这onDestroy()就是所谓的。loadAd启动任何后台线程。我想这与这个问题有关。
public class SnippetFragment extends Fragment
{
private AdView mAdView;
private OnAdFinishedLoadingListener onAdFinishedLoadingListener;
private Context context;
private AdRequest adRequest;
private final String DEVICE_ID_ZTE = "1CA20334345BB1479C43692AFA576456487A48";
private final String DEVICE_ID_MOTO_G = "131465469A7BE11543543065404B168908CB13C8D1";
public SnippetFragment(Context context)
{
this.context = context;
}
@Override
public void onActivityCreated(Bundle bundle)
{
super.onActivityCreated(bundle);
mAdView = (AdView)getView().findViewById(R.id.adView);
mAdView.setAdListener(new AdListener()
{
@Override
public void onAdLoaded()
{
super.onAdLoaded();
if (context …Run Code Online (Sandbox Code Playgroud) 我必须遵循以下代码:
import java.time.LocalDateTime;
import java.time.ZoneId;
import java.time.ZoneOffset;
import java.time.ZonedDateTime;
import java.util.ArrayList;
import java.util.List;
import java.util.Set;
public class TimeZonesExample
{
public static void main(String[] args)
{
Set<String> allZones = ZoneId.getAvailableZoneIds();
LocalDateTime localDateTime = LocalDateTime.now();
List<String> zoneList = new ArrayList<>(allZones);
for (String s : zoneList)
{
ZoneId zoneId = ZoneId.of(s);
ZonedDateTime zoneDateTime = localDateTime.atZone(zoneId);
ZoneOffset zoneOffset = zoneDateTime.getOffset();
String out = String.format("%35s %10s%n", zoneId, zoneOffset);
System.out.printf(out);
}
}
}
Run Code Online (Sandbox Code Playgroud)
这产生了这样一个列表:
Asia/Aden +03:00
America/Cuiaba -03:00
Etc/GMT+9 -09:00
Etc/GMT+8 -08:00
Africa/Nairobi +03:00
America/Marigot -04:00 …Run Code Online (Sandbox Code Playgroud) 我的目标是从客户端收集数据,该客户端将数据发送到UDP服务器,将数据串联为一个字符串(仅用于测试),然后将整个串联的字符串发送回客户端。UDPClient和UDPServer之间的通信非常完美。我可以发送和接收数据。但是我不知道为什么不能在StringBuffer中连接数据,因为当我尝试这样做时,客户端总是得到我发送过的第一个字符串。而且,无论我要发送到服务器什么,字符串都不会更改。这是服务器类的代码:
import java.io.IOException;
import java.net.DatagramPacket;
import java.net.DatagramSocket;
import java.net.InetAddress;
import java.net.SocketException;
public class UDPServer extends Thread {
DatagramSocket serverSocket;
DatagramPacket receivePacket;
String sentence;
InetAddress IPAddress;
StringBuffer data = new StringBuffer();
public UDPServer() throws SocketException {
serverSocket = new DatagramSocket(9876);
}
public void run() {
while (true) {
byte[] receiveData = new byte[1024];
byte[] sendData = new byte[1024];
receivePacket = new DatagramPacket(receiveData, receiveData.length);
try {
serverSocket.receive(receivePacket);
} catch (IOException e) {
System.out.println("receive....");
e.printStackTrace();
}
sentence = new String(receivePacket.getData());
IPAddress = receivePacket.getAddress(); …Run Code Online (Sandbox Code Playgroud) 在Java的正则表达式中有一些我不理解的东西.我有以下字符串(我需要"到日期"):
From Date :01/11/2011 To Date :30/11/2011;;;;;;;;;;;;;
Run Code Online (Sandbox Code Playgroud)
我认为以下正则表达式(在Perl中)会匹配.
to\\s+date\\s*?:\\s*?([0-9]{2}[\\./][0-9]{2}[\\./][0-9]{2,4})
Run Code Online (Sandbox Code Playgroud)
在Java中,此模式不匹配.但是,如果我在前面和后面添加一个,.+
那么这样做,所以这个模式适用于Java:
Pattern p = Pattern.compile(".+to\\s+date\\s*?:\\s*?([0-9]{2}[\\./][0-9]{2}[\\./][0-9]{2,4}).+", Pattern.CASE_INSENSITIVE);
Run Code Online (Sandbox Code Playgroud)
我不明白的是:我很清楚,如果我添加一个^(行的开头)和一行$的末尾,第一个模式在Java中是不匹配的.这意味着,模式必须匹配整条线.但是如果没有这个,第一个模式应该实际匹配,因为如果我没有在前面和末尾设置分隔符,为什么模式关心超出此模式范围的字符串数据呢?这对我来说不合逻辑.在我看来,第一个模式的行为类似于String类的"contains"方法.我认为在Perl中也是如此.
首先,这里所有类似的帖子都没有帮助.
在AsyncTask中,我检查应用程序启动是否是第一次启动,这意味着我检查是否有数据库.我希望通过表格查询来做到这一点.这是正在执行的内容:
@Override
public List<Entity> loadAll(Entity markerEntity)
{
Log.i(TAG, "trying to load all entities of type " + markerEntity.getTable());
List<Entity> results = new LinkedList<Entity>();
SQLiteDatabase db = defaultSQLiteOpenHelper.getWritableDatabase();
Cursor cursor = db.query(markerEntity.getTable(), markerEntity.getAllColumns(), null, null, null, null, null);
cursor.moveToFirst();
while (!cursor.isAfterLast())
{
Entity result = markerEntity.createNewInstance(cursor);
results.add(result);
cursor.moveToNext();
}
db.close();
return results;
}
Run Code Online (Sandbox Code Playgroud)
与IllegalArgumentException崩溃:数据库未打开发生在此行上.
SQLiteDatabase db = defaultSQLiteOpenHelper.getWritableDatabase();
Run Code Online (Sandbox Code Playgroud)
它恰好发生在方法(见下文)createAllTables上.
该文件说:
创建和/或打开将用于读写的数据库.第一次调用它时,将打开数据库并调用onCreate(SQLiteDatabase),onUpgrade(SQLiteDatabase,int,int)和/或onOpen(SQLiteDatabase).
在我看来,它应该执行我的DefaultSQLiteOpenhelper并创建所有数据库表,但它不会这样做:
public class DefaultSQLiteOpenHelper extends SQLiteOpenHelper implements ISQLiteOpenHelper
{
private static …Run Code Online (Sandbox Code Playgroud) 可能我还不了解TableLayout的布局属性.似乎不可能像HTML那样实现这样灵活的表,因为没有单元格.我的目标是实现这样的布局:

我怎样才能做到这一点?我想过使用GridView,但这似乎在XML中没用.我的努力看起来像这样:
<TableLayout
android:id="@+id/tableLayout"
android:layout_width="320sp"
android:layout_height="fill_parent"
android:layout_gravity="center_horizontal"
android:gravity="bottom"
android:layout_alignParentBottom="true">
<TableRow
android:background="#333333"
android:gravity="bottom"
android:layout_width="fill_parent">
<Button
android:id="@+id/btnUp"
android:layout_width="60sp"
android:layout_height="50sp"
android:gravity="left"
android:text="Lift U"
/>
<Button
android:id="@+id/btnScreenUp"
android:gravity="right"
android:layout_gravity="right"
android:layout_width="60sp"
android:layout_height="50sp"
android:text="Scrn U"
/>
</TableRow>
<TableRow
android:background="#444444"
android:gravity="bottom"
android:layout_gravity="right">
<Button
android:id="@+id/btnDown"
android:layout_width="60sp"
android:layout_height="50sp"
android:text="Lift D"
/>
<Button
android:id="@+id/btnScreenLeft"
android:layout_width="60sp"
android:layout_height="50sp"
android:gravity="right"
android:layout_gravity="right"
android:text="Scrn L"
/>
<Button
android:id="@+id/btnScreenDown"
android:layout_width="60sp"
android:layout_height="50sp"
android:gravity="right"
android:layout_gravity="right"
android:text="Scrn D"
/>
<Button
android:id="@+id/btnScreenRight"
android:layout_width="60sp"
android:layout_height="50sp"
android:gravity="right"
android:layout_gravity="right"
android:text="Scrn R"
/>
</TableRow>
</TableLayout>
Run Code Online (Sandbox Code Playgroud) 我想将一个类型存储为参数,但是当我返回它并在JUnit测试中检入时,我会得到类似的东西
Expected: an instance of Java.lang.String
but: <class java.lang.String> is a java.lang.class
Run Code Online (Sandbox Code Playgroud)
这是班级的最小化例子......
public class ContextVariableResult<T> {
private Class<T> type;
public ContextVariableResult(Class<T> type) {
this.type = type;
}
//TODO doesn't work
public Class<T> getType() {
return type;
}
}
Run Code Online (Sandbox Code Playgroud)
我传递String.class作为构造函数参数.
我的测试看起来像这样....
assertThat(result.getType(), instanceOf(String.class));
Run Code Online (Sandbox Code Playgroud)
我认为我的hamcrest匹配器是错误的,但由于编译错误,我不能使用is(String.class)或isA(String.class):
The method assertThat(T, Matcher<? super T>) in the type Assert is not applicable for the arguments (Class<capture#3-of ?>,
Matcher<String>)
Run Code Online (Sandbox Code Playgroud)
我已经尝试返回反射对象Type,我也尝试转换为ParameterizedType,但后来我得到了ClassCastExceptions等等.
我希望方法结果为"String".我错了什么?如果我不需要传递参数"String.class"会好得多,但我认为我总是会遇到类型擦除问题.